Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 如何判断DataGridCheckBoxColumn中的行是否在DataGrid中被选中?_C#_.net_Wpf - Fatal编程技术网

C# 如何判断DataGridCheckBoxColumn中的行是否在DataGrid中被选中?

C# 如何判断DataGridCheckBoxColumn中的行是否在DataGrid中被选中?,c#,.net,wpf,C#,.net,Wpf,如果我在数据网格中有一个DataGridCheckBoxColumn(而不是使用数据网格的多选模式),我如何跟踪或发现已检查的行 DataGrid中是否有合适的属性可以为每行枚举并检查列?DataGrid.ItemsSource将为我提供基础集合-我希望能够获取网格行项目中的列 如果我响应复选框的单击事件,我将如何确定此复选框属于基础集合中哪个项目的哪一行 <DataGrid x:Name="dgPlayers" AutoGenerateColumns="False" Height="45

如果我在数据网格中有一个DataGridCheckBoxColumn(而不是使用数据网格的多选模式),我如何跟踪或发现已检查的行

DataGrid中是否有合适的属性可以为每行枚举并检查列?DataGrid.ItemsSource将为我提供基础集合-我希望能够获取网格行项目中的列

如果我响应复选框的单击事件,我将如何确定此复选框属于基础集合中哪个项目的哪一行

<DataGrid x:Name="dgPlayers" AutoGenerateColumns="False" Height="450" CanUserAddRows="False" AlternationCount="2" AlternatingRowBackground="WhiteSmoke" GridLinesVisibility="None">
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn></DataGridCheckBoxColumn>
                    <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Position" Binding="{Binding Path=PositionCode, Converter={StaticResource NFLPositionGrouper}}"></DataGridTextColumn>
                    <DataGridTextColumn Header="College" Binding="{Binding Path=CollegeName}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>


正如您所看到的,我没有将DataGridCheckBoxColumn绑定到任何属性-我的目的是使用它进行选择(是的,我知道,DataGrid已经内置了多个选择…这纯粹是一个学术练习)

您可以尝试类似的方法

 foreach (GridViewRow row in yourgrid.Rows)
    {
        Access the CheckBox
        CheckBox cb = (CheckBox)row.FindControl("youcheckboxid");
        if (cb != null && cb.Checked==true)
        {

          //you should now know the row where the checkbox was cheked 
         }
    }

虽然我不知道如何枚举每个DataGridRow,正如您在ASP.NET中通过.Rows集合所做的那样,但我意识到这不是一个好主意,Microsoft可能有意省略了此属性

这是因为DataGrid与许多其他列表控件一样使用UI虚拟化,这意味着它只为可见行生成DataGridRow项—如果您可以枚举每一行,这将破坏此功能的用途,并不必要地消耗内存

正如许多人所提到的(我并不反对),最终最好的方法是按照MS的预期方式使用网格,这是一种面向对象的方式,通过直接访问绑定到底层对象

然而,我确实找到了一些接近我想要的东西,这确实让我能够访问实际的DataGridRow对象:

myDataGridInstance.ItemContainerGenerator.ContainerFromItem()

这两种方法都将为您提供与指定集合对象相对应的DataGridRow,之后您可以像您期望的任何其他普通元素一样,解析和导航它的可视树和属性(例如它自己的DataContext将是集合项实例)

我发现的另一种跟踪所有复选框标记的方法是通过Control.Tag属性关联底层对象绑定-我将其设置为{binding},它只将其绑定到底层集合对象本身,在复选框的事件处理程序中,我可以手动跟踪选中/未选中的项目列表,而不是特定的属性


这肯定不是一种明智的做法——但这是可能的,这也是我一直在寻找的——话虽如此,我现在将回到MS希望我们做的事情:)

这取决于具体情况,理想情况下,我建议使用一个按钮来触发事件,以检查哪些行被检查。对不起,我应该提到-这是一个WPF数据网格,而不是ASP.NET。事实上,最初我想用“WPF-”来标记我的问题,但在我写的另一篇文章中,有人冒昧地从标题中删除了这一点,因为我已经用WPF关键字标记了它,您的DataGrid是如何获取其行的?带装订的?为了什么?显示Xaml。我的想法是:对绑定到的对象进行迭代怎么样?网格是通过将代码中的ItemsSource设置为强类型对象的LINQ to Entities查询来填充的,这一点也不奇怪。迭代集合中的对象如何让我访问相应的DataGrid行?在代码隐藏中,使用公共属性引发PropertyChange,它是存储类的列表(或其他IEnumerable)。然后在某个时刻用Linq查询填充它。在Xaml中,您将ItemSource绑定到属性。因此,您可以随时使用该属性访问任何行的值。您可以发布xaml控件吗?您应该将复选框列绑定到实际的DTO。由于它们是绑定的,所以您应该能够查看实际的数据收集,以查看哪些内容已被检查或未发布。我没有将复选框列绑定到绑定对象的任何属性。不过,您提出了一个很好的观点。我主要来自ASP.NET背景,因此我想利用这个示例来熟悉导航网格行的对象层次结构,并在需要时访问每个网格行中的各个控件
myDataGridInstance.ItemContainerGenerator.ContainerFromIndex()