Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在过滤的WPF数据网格中找到正确的行索引_C#_Wpf_Datagrid - Fatal编程技术网

C# 如何在过滤的WPF数据网格中找到正确的行索引

C# 如何在过滤的WPF数据网格中找到正确的行索引,c#,wpf,datagrid,C#,Wpf,Datagrid,我们正在使用WPF数据网格与VS 2015一起开发WPF应用程序 在此DataGrid中,我们可以过滤更改DataGrids项集合的行(未过滤的我们有p.e.100项和过滤的20项) 此外,我们可以通过单独的编辑对话框更改数据 当该对话框关闭时,应刷新DataGrid中的数据(通过从数据库读取数据并重新设置源),并将SelectedIndex设置为刷新前的索引 当DataGrid未过滤时,您将通过以下方式检测当前选定行的索引: int currentIndex = grid.Items.Inde

我们正在使用WPF数据网格与VS 2015一起开发WPF应用程序

在此DataGrid中,我们可以过滤更改DataGrids项集合的行(未过滤的我们有p.e.100项和过滤的20项)

此外,我们可以通过单独的编辑对话框更改数据

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

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

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

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

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

与此同时,我甚至尝试了米兰提出的准则,但没有成功:

var row = grid.ItemContainerGenerator.ContainerFromIndex(grid.SelectedIndex);
vm.RefreshList();
grid.SelectedIndex = grid.ItemContainerGenerator.IndexFromContainer(row);
在这种情况下,变量行在调用方法RefreshList后断开连接。 甚至在我使用IndexFromContainer之前,索引错误-0而不是3

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


提前谢谢

那么,你知道解决方案就在你眼前,但你看不见的情况吗

这是我的问题

刷新datagrid的源后,Items集合未被过滤

当我将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;
}

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

您得到了正确的索引。您要选择哪个项目?当您尝试选择项目时,列表是否已过滤?@mm8:当我尝试时,列表已过滤。我编辑了过滤列表中的第一项,它在未过滤的网格中有索引3。在筛选的网格中,它选择了索引0。但当我将SelectedIndex after refresh设置为0时,我并没有选择过滤变量的第一行,而是选择了未过滤变量的第一行。与此同时,我已经找到了这种情况发生的原因。刷新后,项目再次包含未筛选的列表。在我设置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;
}