如何在datagrid中选择行索引?
事件SelectionChanged
以下代码不起作用:
private DataGridRow dgr = new DataGridRow();
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.dgr = this.dataGrid.ItemContainerGenerator.ContainerFromItem(this.dataGrid.SelectedItem) as DataGridRow;
MessageBox.Show(this.dgr.GetIndex().ToString());
}
答案 0 :(得分:3)
上面的代码不起作用的原因是因为wpf数据网格是虚拟化的,并且它可能不会使用itemContainerGenerator.ContainerFromItem返回行,因为它可能位于滚动视图之外。
为此,您必须使用datagrid的items集合和使用所选项目的IndexOf调用。
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var dg = sender as DataGrid;
MessageBox.Show(dg.Items.IndexOf(dg.SelectedItem).ToString());
}
答案 1 :(得分:2)
我的回答很晚,但我希望它对于那些从搜索引擎中找到这篇文章的人来说仍然有用。这是更通用的解决方案,它也有助于定义所有选定行的索引。
List<int> RowIndexes = new List<int>();
int SelectedItemsCount = yourDataGrid.SelectedItems.Count;
for (int i = 0; i < SelectedItemsCount ; i++)
{
RowIndexes.Add(yourDataGrid.Items.IndexOf(yourDataGrid.SelectedItems[i]));
}
现在RowIndexes包含所选行的所有索引。只需将代码放在您希望的事件中,就是这样。
答案 2 :(得分:1)
这是一个迟到的答案,但这就是我完成它的方式。这为您提供了DataGrid中每个选定行的索引(dgQuery是我的DataGrid的名称):
foreach (var selection in dgQuery.SelectedItems)
{
DataRowView row = (DataRowView)item;
int index = Convert.ToInt32(row.Row[0]) - 1;
}
它在索引0处给出1,因此我们需要在每个索引处减去1。
.Row[0]
实际上是DataRowView的一个列(在我的脑海中),不知道为什么它被称为行。您可以将其更改为[1],[2]等,以查看该行中的其他单元格。
使用此解决方案,您不需要集合,数组,也不需要那种类型。您只需使用手边的内容并使用现有代码即可。
这个实现的巨大优势,至少对我而言,是它按照选择的顺序遍历选定的项目。如果您想知道用户选择的顺序,这可以是一个非常强大的工具。
我发布这个是因为我花了4个多小时寻找解决方案。我甚至放弃了复选框,因为我没有足够的时间来实现这些工作......也许是在路上。