【问题标题】:WPF DataGrid - Disable Sorting and Filtering while Editing Rows?WPF DataGrid - 在编辑行时禁用排序和过滤?
【发布时间】:2011-07-11 06:48:11
【问题描述】:

有没有人尝试实现以下场景?我有兴趣了解有哪些解决方案可以实现这一目标。这对我们的用户来说已经成为一个真正的痛苦......

我们有一个 WPF DataGrid,它使用户能够根据列(其中 Column = 值或开始于、结束于、包含等)过滤他们的数据行。他们还可以通过单击其中一个列标题对数据进行排序,或者我们还为他们提供了一个排序窗口,他们可以在其中添加多个列并为每列选择升序/降序(仅应用于每个列的“SortDirection”属性他们选择,它似乎也使用“CollectionView”和 SortDescriptions)。

问题是当用户正在编辑数据并应用了“过滤器”或“排序”(或两者)时,如果用户编辑这些过滤/排序列之一上的值,该行将“移动”并且带上光标。如果新值是经过“过滤”的值,则该行将完全消失(因为用户应用了“过滤”,它应该会消失)。

他们希望发生以下两种情况之一:

1 - 继续并在每个单元格更改后自动排序和过滤,如果行“移动”,则将光标移动到下一行(相同的单元格)而不是光标跟随行到新的目的地(可能滚动当前可查看的数据行离开屏幕)。

2 - 编辑一行后,禁用所有排序和过滤,直到用户单击“保存”或“刷新”(或其他选项)?

我还可以看到我们可以在哪里采用一种方法进行过滤,另一种方法进行排序。

有没有人有更好的想法或对如何实现这一点有任何想法?

我有几个想法(例如,要禁用排序:在我的 CellEditEnding 事件处理程序中,我可以存储用户排序选项,从每一列中清除它们,然后在用户单击保存/重置时重新应用它们,或者也许当正在编辑数据时,我可以处理“排序”事件并将“e.handled”设置为true??)。我对 WPF 和 DataGrid 还很陌生,我想知道是否存在“最佳实践”或我尚未找到的属性,例如“DisableSorting=true/false”(哈哈)。

想法?意见?

【问题讨论】:

  • 您是如何在编辑行时设法更改过滤器的?因为当控件失去焦点并且 CollectionView 出现错误“'Filter' is not allowed during an AddNew or EditItem”时编辑完成。
  • 我考虑过绑定到 DataGridRow 类的 IsEditing 属性,但 Filter 属性不允许测试您的场景。
  • 我没有。我只是说这是一个“想法”。 :) 我没有看到一个简单的解决方案。也许覆盖执行实际排序的 DataGrid 方法?我似乎找不到它。有一种“排序”方法,但它只是在单击列时触发。实际的“SORT”是什么方法?
  • 涡流。我的意思是......一旦用户完成编辑,然后列排序,他们可能会跳转到数据集中一个全新的地方并失去他们的位置。这基本上是为一组用户设计的 Microsoft Access 替代品。我不确定您是否熟悉 Access 如何执行此操作,但即使您应用了排序和过滤,它也不会重新应用到您编辑的行。
  • @Vortex。虽然它正在改变它在网格中的位置。我没有看到任何调用 Refresh 的地方。这是关于我试图克服的同一问题的另一篇文章:social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/…

标签: wpf datagrid wpfdatagrid


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    然后我意识到了一些事情。首先,我需要使用 DataTable.DefaultView 并获取主/源 DataTable 的“过滤”视图并将其分配给 DataTableCopy(因此过滤后的行不会出现在他们将要编辑的 DataTable 中)。那不应该是问题,我不认为.. 然后,我意识到会有问题。一旦他们按照他们想要的方式过滤和排序数据,然后我复制它并将 DataGrid 重新绑定到复制的表(不包含隐藏或过滤的行),数据将不再正确排序。正确的???如何使其正确排序,但在编辑行和列时不使用 DataGrid?

    如你所见,我基本上已经回到原来的问题上!如果我能以某种方式“禁用”过滤和排序,但保持数据有序和过滤!

    我对此没有太多经验,但我不能(理论上)使用反汇编程序(Reflector?虽然它仍然是免费的..lol...)并构建我自己的 DataGrid 类?我只需要覆盖用于进行过滤/排序的任何方法。正确的?我已经浏览了 DataGrid 类,但甚至不知道要“覆盖”哪些方法。我认为有一种方法可以设置 Reflector,这样您就可以进入(调试)反汇编代码。看来这可能是我唯一的选择。

    还有其他建议吗??

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

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 2018-05-08
      • 2010-12-04
      • 2010-12-27
      • 2011-08-23
      • 2012-10-04
      • 2019-02-24
      • 2013-03-12
      • 2011-04-25
      相关资源
      最近更新 更多