0

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

4

2 回答 2

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 
         }
    }
于 2012-08-19T06:19:31.553 回答
0

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

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

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

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

myDataGridInstance.ItemContainerGenerator.ContainerFromItem()

或者

myDataGridInstance.ItemContainerGenerator.ContainerFromIndex()

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

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

绝对不是一个聪明的方法 - 但这是可能的,这就是我一直在寻找的 - 话虽如此,我现在将回到 MS 打算让我们做的事情:)

于 2012-08-19T20:59:14.753 回答