WPF数据网格 - 在编辑行时禁用排序和过滤?

4
有人尝试实现以下场景吗?我想知道有哪些解决方案可以完成此操作。这对我们的用户来说真的很痛苦...
我们有一个 WPF DataGrid,它使用户可以根据列(其中Column=Value或Begins With、Ends With、Contains等等)过滤数据行。他们还可以通过单击其中一个列标题来对数据进行排序,或者我们也提供了一个排序窗口,他们可以在其中添加多个列,并为每个列选择升序/降序(这只是应用于他们选择的每个列的“SortDirection”属性,它似乎还使用了一个“CollectionView”以及“SortDescriptions”)。问题是,当用户编辑数据并且有“filter”或“sort”(或两者兼有)时,如果用户编辑其中一个已经过滤/排序的列上的值,则该行将"移动"并随之带动光标。如果新值是一个被"过滤"的值,则该行将完全消失(由于用户应用了"过滤")。
他们想要发生以下两种情况中的其中一种:
1 - 每次更改单元格后立即自动进行排序和过滤,如果行“移动”,则将光标移动到下一行(相同单元格) ,而不是光标跟随行到其新位置(可能会导致当前可视数据行滚动到屏幕外)。
2 - 一旦编辑了行,禁用所有排序和过滤,直到用户点击"保存"或"刷新"(或其他选项)?
我也可以看到我们可能会在过滤和排序上采取不同的方法。
有人有更好的想法或者有任何关于如何实现此操作的想法吗?
我有一些想法(例如,要禁用排序: 在我的 CellEditEnding 事件处理程序中,我可以存储用户的排序选项,从每个列中清除它们,然后在用户单击“保存”/“重置”时重新应用它们,或者我可以处理“Sorting”事件并将“e.handled”设置为true,当数据正在被编辑时?)。我对 WPF 和 DataGrid 还是太新了,我想知道是否存在一个“最佳实践”或我还没有找到的属性,比如“DisableSorting = true/false”(lol)。
有什么想法?意见?

你是如何在编辑行时更改过滤器的?因为当控件失去焦点并且CollectionView出现错误“'Filter'不允许在AddNew或EditItem期间使用”时,编辑就完成了。 - vortexwolf
我考虑绑定到DataGridRow类的IsEditing属性,但Filter属性不允许测试您的情况。 - vortexwolf
我没有。我只是说这是一个“想法”。 :) 我看不到简单的解决方案。也许可以重写实际排序的 DataGrid 方法?但我似乎找不到它。有一个“Sorting”方法,但它仅在单击列时触发。哪个方法实际上执行“SORT”操作? - Shayne
1
Vortex。我的意思是...一旦用户完成编辑,然后列进行排序,他们可以跳转到数据集中的任何地方,并且可能会丢失他们的位置。这基本上是为一组用户设计的Microsoft Access替代品。我不确定您是否熟悉Access如何处理此问题,但即使应用了排序和筛选,也不会重新应用到您编辑的行。 - Shayne
1
@Vortex。它正在改变其在网格中的位置。我没有看到任何刷新被调用的地方。这是另一个关于我正在努力克服的相同问题的帖子:http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/c3cc827c-8730-4bc6-89dc-c8e8e9e58fdb/。 - Shayne
显示剩余2条评论
2个回答

3

我刚遇到了同样的问题,似乎找到了解决方案。很简单-只需添加另一个SortDescription作为次要排序标准即可。


0

我决定从不同的角度来尝试解决这个问题,基于一篇微软员工的帖子。以下是我尝试过的方法...看起来我的唯一剩下的选择是创建自己的DataGrid并覆盖适当的方法。

我决定添加一个按钮来“锁定”DataGrid。在那时,我会禁用所有排序、过滤、删除列等等。然后我会复制DataTable并将DataGrid.DataContext更改为我的新表格,在他们完成编辑后,他们会“解锁”DataGrid,此时我会执行DataTable.Merge()并重新绑定到主/源。所有他们的更改都将在“主”DataTable中,并且他们将能够编辑行和列,而不会出现行跳动(排序)或消失(过滤)的情况。

然后我意识到了一些事情。首先,我需要使用DataTable.DefaultView并获取主/源DataTable的“过滤”视图,并将其分配给DataTableCopy(以便过滤的行不会出现在它们要编辑的DataTable中)。我认为这不应该是一个问题..然后,我意识到了一个问题。一旦他们按照自己的想法对数据进行了过滤和排序,那么我就复制它并重新绑定DataGrid到复制的表格(其中不包含他们隐藏或过滤的行),数据将不再正确排序。对吧???我怎样才能使它正确排序,但在他们编辑行和列时不重新排序DataGrid呢?
正如您所看到的,我基本上已经回到了最初的问题!如果我可以以某种方式“禁用”过滤和排序,但保持数据有序和过滤!

我对这方面没有太多经验,但是理论上我不能使用反汇编器(Reflector?只要它还是免费的..lol...)并构建自己的DataGrid类吗?我只需要覆盖用于过滤/排序的任何方法。对吧?我已经浏览了一下DataGrid类,但甚至无法弄清楚要“覆盖”的哪些方法。我认为有一种方法可以设置Reflector,以便您可以进入(调试)反汇编的代码。看起来这可能是我的唯一选择。

还有其他建议吗?

更新:我的假设是错误的!看起来如果我使用DataTable.DefaultView.ToTable(),它不仅“保留”过滤,而且保留“排序顺序”。这个解决方案看起来终究会奏效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接