简体   繁体   English

如何遍历WPF工具包Datagrid的行

[英]How to loop over the rows of a WPF toolkit Datagrid

I have the next code where I defined a WPF toolkit datagrid control called dgQuery; 我有下一个代码,我定义了一个名为dgQuery的WPF工具包数据网格控件; I filled this one with information of a dataset, then I inserted a new checkbox column in dgQuery to check/uncheck some of the rows, I show part of my C# code: 我用数据集的信息填充了这个,然后我在dgQuery中插入了一个新的复选框列来检查/取消选中某些行,我展示了部分C#代码:

dgQuery.DataContext = dS.Tables[0];

DataGridTemplateColumn cbCol = new DataGridTemplateColumn();
cbCol.Header = "Opc";
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CheckBox));
Binding bind = new Binding("IsSelected");
bind.Mode = BindingMode.TwoWay;
factory.SetValue(CheckBox.IsCheckedProperty, bind);
DataTemplate cellTemplate = new DataTemplate();
cellTemplate.VisualTree = factory;
cbCol.CellTemplate = cellTemplate;
dgQuery.Columns.Insert(0, cbCol);

After checking/unchecking into the new checkbox column of the dgQuery rows I will click a button to save into a database only the rows I checked. 在检查/取消选中dgQuery行的新复选框列后,我将单击一个按钮,仅将我检查的行保存到数据库中。 The question is, how can I develop the loop for reading all the rows of dgQuery and the condition that will let me know which rows have the checkbox checked/unchecked? 问题是,如何开发用于读取dgQuery的所有行的循环以及让我知道哪些行具有选中/取消选中复选框的条件? Help me with an example, please. 请帮我举个例子。

Thanks!! 谢谢!!

this will return a 'row' in your datagrid 这将在您的数据网格中返回一个“行”

public IEnumerable<Microsoft.Windows.Controls.DataGridRow> GetDataGridRows(Microsoft.Windows.Controls.DataGrid grid)
    {
        var itemsSource = grid.ItemsSource as IEnumerable;
        if (null == itemsSource) yield return null;
        foreach (var item in itemsSource)
        {
            var row = grid.ItemContainerGenerator.ContainerFromItem(item) as Microsoft.Windows.Controls.DataGridRow;
            if (null != row) yield return row;
        }
    }

in wpf datagrid, rows are ItemSource.items... no Rows property! 在wpf datagrid中,行是ItemSource.items ...没有Rows属性!

Hope this helps... 希望这可以帮助...

 var row = GetDataGridRows(dataGrid1);
 /// go through each row in the datagrid
            foreach (Microsoft.Windows.Controls.DataGridRow r in row)
            {
                DataRowView rv = (DataRowView)r.Item;

                // Get the state of what's in column 1 of the current row (in my case a string)
                string t = rv.Row[1].ToString();


            }

Not sure if this is helpful because it assumes a different approach than what you started with, but rather than working directly with the grid, you could bind it to an ObservableCollection of objects that have properties for each column. 不确定这是否有用,因为它采用与您开始时不同的方法,而不是直接使用网格,您可以将其绑定到具有每列属性的对象的ObservableCollection。 If you add a bool property in your object for "Selected" and bind the checkbox column to it, you can then query the collection at any time for what is currently selected, like this: 如果在对象中为“Selected”添加bool属性并将checkbox列绑定到它,则可以随时查询该集合以查找当前选择的内容,如下所示:

 List<MemberEntity> selectedItems = 
            new List<MemberEntity>(from memberEntity in _memberEntities 
                                   where memberEntity.Selected == true 
                                   select memberEntity);

        //now save selectedItems to the database...

So MemberEntity is a class that has a property for each of the columns in your grid, including a bool called Selected for the checkbox column. 因此,MemberEntity是一个类,它为网格中的每个列都有一个属性,包括一个名为Selected的复选框列的bool。 _memberEntities is an ObservableCollection of MemberEntity instances. _memberEntities是MemberEntity实例的ObservableCollection。 The grid's ItemSource property is bound to _memberEntities and each of its column's Binding properties are bound to a property in MemberEntity like this, assuming that Selected and Name are properties in MemberEntity: 网格的ItemSource属性绑定到_memberEntities,并且其每个列的Binding属性都绑定到MemberEntity中的属性,假设Selected和Name是MemberEntity中的属性:

<tk:DataGrid ItemsSource="{Binding _memberEntities}">
        <tk:DataGrid.Columns>
            <tk:DataGridCheckBoxColumn Binding="{Binding Path=Selected}" />
            <tk:DataGridTextColumn Binding="{Binding Path=Name}" />
        </tk:DataGrid.Columns>
</tk:DataGrid>
//Looping thought datagrid rows & loop though cells and alert cell values

var row = GetDataGridRows(DataGrid_Standard);
/// go through each row in the datagrid 
foreach (Microsoft.Windows.Controls.DataGridRow r in row)
{
    DataRowView rv = (DataRowView)r.Item;
    foreach (DataGridColumn column in DataGrid_Standard.Columns)
    {
        if (column.GetCellContent(r) is TextBlock)
        {
            TextBlock cellContent = column.GetCellContent(r) as TextBlock;
            MessageBox.Show(cellContent.Text);
        }
        else if (column.GetCellContent(r) is CheckBox)
        {
            CheckBox chk = column.GetCellContent(r) as CheckBox;
            MessageBox .Show (chk.IsChecked.ToString());
        }                      
    }
} 

public IEnumerable<Microsoft.Windows.Controls.DataGridRow> GetDataGridRows(Microsoft.Windows.Controls.DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;
    if (null == itemsSource) yield return null;
    foreach (var item in itemsSource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as Microsoft.Windows.Controls.DataGridRow;
        if (null != row) yield return row;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM