如果我在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已经内置了多个选择...这纯粹是一个学术练习)
答案 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希望我们做的事情:)