如何确定DataGrid中是否检查了DataGridCheckBoxColumn中的行?

时间:2012-08-19 06:06:11

标签: c# .net wpf

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

DataGrid中是否有合适的属性来枚举每一行并检查列? DataGrid.ItemsSource将为我提供底层集合 - 我希望能够获取网格行项中的列本身

如果我回复了CheckBox的Click事件,我怎样才能找出这个CheckBox属于底层集合中哪个项目的哪一行?

<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已经内置了多个选择...这纯粹是一个学术练习)

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情

 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 
         }
    }

答案 1 :(得分:0)

虽然我无法弄清楚如何枚举每个DataGridRow,就像你可以通过.Rows集合在ASP.NET中做到的那样,我意识到这无论如何都不是一个好主意,并且Microsoft可能故意省略此属性。

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

正如许多人提到的那样(我并不反对),最好的方法是以MS的方式使用网格,这是以OO方式,通过直接访问它来绑定到底层对象。

但是,我确实找到了我想要的东西,这确实让我可以访问实际的DataGridRow对象:

myDataGridInstance.ItemContainerGenerator.ContainerFromItem()

或者

myDataGridInstance.ItemContainerGenerator.ContainerFromIndex()

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

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

绝对不是一个聪明的方法 - 但这是可能的,而这正是我所寻求的 - 说完了,我现在回去做MS希望我们做的事情:)