如果在datagrid C#中选中复选框,则获取整行值

时间:2014-02-11 20:23:52

标签: c# wpf checkbox datagrid selected

如果选中同一行中的某些复选框,我正在尝试编写一个代码,用于从文本框中获取3个值。 任何人都知道一种简单(或很难)的方法吗?

我的数据网格如下所示:enter image description here

我有一个Load按钮,在文件系统的某处找到一个特定类型的文件(XML.config),然后我调用一个方法从该文件中获取一些字符串,找到它们的子串并将它们分成3个分隔名单。这些值在数据网格中为Type,MapTo和Name。 我通过将所有3个列表放在一个ObservableCollection中来完成此操作,之后我将ObservalableCollection发送到datagrid,如下所示:

ObservableCollection<Tuple<string, string, string>> _obsCollection = new   ObservableCollection<Tuple<string, string, string>>();
public ObservableCollection<Tuple<string, string, string>> MyObsCollection
{
    get { return _obsCollection; }
}
tabela.ItemsSource = _obsCollection;

这是显示绑定的XAML代码:

<DataGrid Grid.Column="0" AutoGenerateColumns="False" Height="206" HorizontalAlignment="Left" Margin="12,265,0,0" Name="tabela" VerticalAlignment="Top" Width="556" SelectionChanged="tabela_SelectionChanged" Grid.RowSpan="2" ItemsSource="Binding MyObsCollection">
            <DataGrid.Columns>

                <DataGridTextColumn Header="Type" Width="122" Binding="{Binding Item1}"/>
                <DataGridTextColumn Header="MapTo" Width="122" Binding="{Binding Item2}"/>
                <DataGridTextColumn Header="Name" Width="121" Binding="{Binding Item3}"/>

                <DataGridTemplateColumn Header="Controller">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding DataGridChecked}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Service">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding DataGridChecked}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Injection">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding DataGridChecked}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>

        </DataGrid>

我实际上尝试的是完成循环所有包含复选框的3列以查看其中哪些被选中,如果选择了同一行中的3个中的任何一个,那么我需要将该行中的所有3个字符串值发送到一些变数。 任何人都可以帮助我。例如,我不知道如何从数据网格中的复选框获取isSelected属性。 我正在进行大量的研究,我能找到的只是DataGridView的示例,而DataGrid几乎没有。

2 个答案:

答案 0 :(得分:2)

不要使用Tuple创建自己的类,而是使用要显示为列的所有属性来说明RowData

public class RowData: INotifyPropertyChanged
{
    //implement INotifyPropertyChanged

    public string Type { get; set; }
    public string MapTo { get; set; }
    public string Name { get; set; }
    public bool Controller { get; set; }
    public bool Service { get; set; }
    public bool Injection { get; set; }
}

更改ObservableCollection以使用您的类型

public ObservableCollection<RowData> MyObsCollection { get { .... } }

并在AutoGenerateColumns="True"

上设置DataGrid
<DataGrid 
   Grid.Column="0" 
   Grid.RowSpan="2" 
   AutoGenerateColumns="True" 
   Height="206" 
   Width="556" 
   HorizontalAlignment="Left" 
   Margin="12,265,0,0" 
   Name="tabela" 
   VerticalAlignment="Top" 
   SelectionChanged="tabela_SelectionChanged" 
   ItemsSource="{Binding MyObsCollection}"/>

然后获取您选择3 CheckBoxes中任意一项的项目:

var selectedList = MyObsCollection.Where(n => n.Controller || n.Service || n.Injection).ToList();

答案 1 :(得分:0)

List<string>chzone=new List<string>();//Declare it as globally,
//Note: if DataGrid is Binded as ,Datagrid.Itemsource=dt.defaultview;
//If datagrid contain the Checkbox, get the checked item row and add it into list
private void DataGridcheckbox_Checked(object sender, RoutedEventArgs e)
        {

            var checker = sender as CheckBox;           
            if (checker.IsChecked == true)
            {
                var item = checker.DataContext as DataRowView;
                object[] obj = item.Row.ItemArray;//getting entire row
                chzone.Add(obj[0].ToString());//getting row of first column value
            }
            else //This is for Unchecked Scenario
            {
                var item = checker.DataContext as DataRowView;
                object[] obj = item.Row.ItemArray;
                bool res = chzone.Contains(obj[0].ToString());
                if (res == true)
                {
                    chzone.Remove(obj[0].ToString());//this is used to remove item in list
                }
            }

        }