在datagrid中选择行索引(wpf)

时间:2011-07-30 10:21:58

标签: c# wpf wpfdatagrid

如何在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());

    }

3 个答案:

答案 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个多小时寻找解决方案。我甚至放弃了复选框,因为我没有足够的时间来实现这些工作......也许是在路上。