【问题标题】:How to find correct row index in filtered WPF datagrid如何在过滤的 WPF 数据网格中找到正确的行索引
【发布时间】:2018-01-30 11:16:47
【问题描述】:

我们正在使用 WPF DataGrid 开发一个带有 VS 2015 的 WPF 应用程序。

在这个 DataGrid 中,我们可以过滤更改 DataGrids 项目集合的行(未过滤我们有 p.e. 100 个项目并过滤了 20 个)。

我们还可以通过单独的编辑对话框更改数据。

当该对话框关闭时,应刷新 DataGrid 中的数据(通过从数据库中读取数据并重新设置源)并将 SelectedIndex 设置为刷新前的索引。

当 DataGrid 未过滤时,您将通过以下方式检测当前选定行的索引

int currentIndex = grid.Items.IndexOf(grid.CurrentItem);

int currentIndex = grid.SelectedIndex;

但是当网格被过滤时,我们在这两种情况下都会得到错误的索引。

例如: 当网格被过滤时,我编辑第一行的数据,这通常是项目列表中的第四行(索引 = 3),但我得到索引 = 0。 当我提醒变量中的 SelectedIndex 0 并在刷新后设置它时,不是选择过滤网格中的第一项,而是选择源的第一项。 当我得到 SelectedItem 并查看属性时,我发现它是错误的项目。

同时我什至尝试了米兰提出的代码但没有成功:

var row = grid.ItemContainerGenerator.ContainerFromIndex(grid.SelectedIndex);
vm.RefreshList();
grid.SelectedIndex = grid.ItemContainerGenerator.IndexFromContainer(row);

在这种情况下,变量row在调用RefreshList方法后断开。 甚至在我使用 IndexFromContainter 得到错误的索引之前 - 0 而不是 3。

我们怎样才能得到正确的索引?

提前致谢!

【问题讨论】:

  • 正在获得正确的索引。您要选择哪个项目?当您尝试选择项目时,列表是过滤还是未过滤?
  • @mm8:当我尝试它时,列表被过滤了。我编辑了过滤列表中的第一项,它在未过滤的网格中具有索引 3。在过滤的网格中,它具有 SelectedIndex 0。但是当我在刷新后将 SelectedIndex 设置为 0 时,我没有选择过滤变体的第一行,而是未过滤的。同时,我发现了为什么会发生这种情况。刷新后,项目再次包含未过滤的列表。就在我设置 SelectedIndex 之后,应用了网格的过滤器。

标签: c# wpf datagrid


【解决方案1】:

那么,当解决方案就在您的眼前,但您看不到它时,您是否知道这种情况?

这是我的问题。

刷新数据网格的源后,Items-collection 未被过滤。

当我将 SelectedIndex 设置为 0 时,我选择了未过滤列表的第一项。

在此之后过滤器被重新应用。

所以我对我的代码做了一些更改。

现在我提醒 SelectedItem 并在刷新后在 foreach 循环中查找该项目 - 这一次 - 我设置了正确的 SelectedIndex。

例子:

MyItem currentItem = grid.SelectedItem as MyItem;
vm.RefreshList();
int n = 0;
foreach (MyItem item in grid.Items)
{
    if (item.pki == currentItem.pki)
    {
        grid.SelectedIndex = n;
        grid.Focus();
        break;
    }
    n += 1;
}

这适用于过滤和未过滤的列表,甚至当数据按列(升序和降序)排序时也是如此。

【讨论】:

  • 在我的情况下,我在 foreach 中使用 Listbox.ItemsSource 从列表框的过滤视图中查找所选项目的原始/绝对索引。 // Object CurrentItem = DocumentsListLB.SelectedItem as Object;诠释 n = 0; foreach (DocumentsListLB.ItemsSource 中的对象项) { if (item == CurrentItem) { SelectedIndex = n;休息; } n += 1; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-01-03
  • 2014-02-12
相关资源
最近更新 更多