Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何循环WPF toolkit Datagrid的行_C#_Wpf_Datagrid_Wpfdatagrid_Wpftoolkit - Fatal编程技术网

C# 如何循环WPF toolkit Datagrid的行

C# 如何循环WPF toolkit Datagrid的行,c#,wpf,datagrid,wpfdatagrid,wpftoolkit,C#,Wpf,Datagrid,Wpfdatagrid,Wpftoolkit,接下来的代码定义了一个名为dgQuery的WPF工具包datagrid控件;我用数据集的信息填充了这一行,然后在dgQuery中插入了一个新的复选框列以选中/取消选中某些行,我显示了部分C代码: 选中/取消选中dgQuery行的“新建复选框”列后,我将单击一个按钮,仅将选中的行保存到数据库中。问题是,如何开发用于读取dgQuery所有行的循环,以及让我知道哪些行已选中/未选中复选框的条件?请帮我举个例子 谢谢 这将在数据网格中返回一行 public IEnumerable<Microsof

接下来的代码定义了一个名为dgQuery的WPF工具包datagrid控件;我用数据集的信息填充了这一行,然后在dgQuery中插入了一个新的复选框列以选中/取消选中某些行,我显示了部分C代码:

选中/取消选中dgQuery行的“新建复选框”列后,我将单击一个按钮,仅将选中的行保存到数据库中。问题是,如何开发用于读取dgQuery所有行的循环,以及让我知道哪些行已选中/未选中复选框的条件?请帮我举个例子


谢谢

这将在数据网格中返回一行

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;
        }
    }
公共IEnumerable GetDataGridRows(Microsoft.Windows.Controls.DataGrid) { var itemsSource=grid.itemsSource作为IEnumerable; 如果(null==itemsSource)产生返回null; foreach(itemsSource中的var项) { var row=grid.ItemContainerGenerator.ContainerFromItem(item)作为Microsoft.Windows.Controls.DataGridRow; 如果(空!=行)产生返回行; } } 在wpf datagrid中,行是ItemSource.items。。。没有行属性


希望这有帮助…

不确定这是否有用,因为它采用了与您开始使用的不同的方法,但您可以将其绑定到具有每列属性的对象的可观察集合,而不是直接使用网格。如果在对象中为“Selected”添加bool属性并将复选框列绑定到该属性,则可以随时查询集合中当前选择的内容,如下所示:

 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();


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

        //now save selectedItems to the database...
List selectedItems=
新列表(来自_memberEntities中的memberEntity)
其中memberEntity.Selected==true
选择成员(实体);
//现在将selectedItems保存到数据库。。。
所以MemberEntity是一个类,它对网格中的每一列都有一个属性,包括一个名为Selected的bool,用于checkbox列_memberEntities是MemberEntity实例的可观察集合。网格的ItemSource属性绑定到_memberEntities,其列的每个绑定属性都绑定到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>

//循环数据网格行&循环单元格和警报单元格值
var row=GetDataGridRows(DataGrid_标准);
///检查数据网格中的每一行
foreach(第行中的Microsoft.Windows.Controls.DataGridRow r)
{
DataRowView rv=(DataRowView)r.Item;
foreach(DataGrid_Standard.Columns中的DataGridColumn列)
{
if(column.GetCellContent(r)是TextBlock)
{
TextBlock cellContent=column.GetCellContent(r)作为TextBlock;
MessageBox.Show(cellContent.Text);
}
else if(column.GetCellContent(r)为复选框)
{
复选框chk=column.GetCellContent(r)作为复选框;
Show(chk.IsChecked.ToString());
}                      
}
} 
公共IEnumerable GetDataGridRows(Microsoft.Windows.Controls.DataGrid)
{
var itemsSource=grid.itemsSource作为IEnumerable;
如果(null==itemsSource)产生返回null;
foreach(itemsSource中的var项)
{
var row=grid.ItemContainerGenerator.ContainerFromItem(item)作为Microsoft.Windows.Controls.DataGridRow;
如果(空!=行)产生返回行;
}
}

Tnxs托尼!我想问一下,我如何评估我插入的复选框列是否已选中/未选中,以及通常我如何检索每个DataGridRow的所有单元格?我们如何在循环每一行时获取行索引Tony,再次感谢您。请再问一个问题,如何评估定义复选框的“opc”列的内容?在DataRowView中,我只能看到数据集列,而不能看到复选框。你好。你为什么不试试MarkB的解决方案来访问datagrid中的复选框?我在这个论坛上又问了你一个问题,因为我自己找不到怎么做,所以这里有一个答案:使用我接受的答案!我自己也没试过,但看起来应该能用!祝你好运请告诉我发生了什么事?托尼,再次感谢你的帮助。我读了1936732,在应用于我的案例时有很多疑问,因此,我决定使用您的原始解决方案,首先,我在数据集中添加了一个类型为Bool的新列,因此它现在模拟了一个复选框(尽管我选中了双击:-),我认为这是一个简单且干净的解决方案。马克,谢谢你的时间和帮助。在应用到我的情况之前,我需要阅读有关可观测收集对象的信息。听起来不错,特里斯坦。使用这种方法的主要优点是将代码与表示分离。因此,您的代码将重点放在集合上,而不是UI控件上。这意味着,如果以后更改UI控件,代码可能不必更改。此外,单元测试更容易,因为您可以通过操纵集合而不是试图操纵UI,以编程方式设置选择项。
<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;
    }
}