WPF DataGrid - 在编辑行时禁用排序和筛选?

时间:2011-03-08 17:06:42

标签: wpf datagrid wpfdatagrid

有没有人试图实施以下方案?我有兴趣了解哪些解决方案可以实现这一目标。这对我们的用户来说真的很痛苦......

我们有一个WPF DataGrid,它允许用户根据Column(其中Column = Value或Begins With,Ends With,Contains等)过滤他们的数据行。他们还可以通过单击其中一个Column标题对数据进行排序,或者我们还为他们提供一个排序窗口,在这个窗口中他们可以添加多个列并为每列选择Ascending / Descending(它只是应用于" SortDirection&#34 ;他们选择的每个列上的属性,它似乎也使用" CollectionView"以及SortDescriptions)。

问题在于用户正在编辑数据并且有一个"过滤器"或"排序" (或两者)应用,如果用户在其中一个过滤/排序列上编辑值,该行将"移动"并将光标随之移动。如果新值是"过滤",那么该行将完全消失(因为它应该由于"过滤"由用户应用)。

他们希望改为两种情况之一:

1 - 继续并在每个单元格更改后自动排序和过滤,如果行"移动",将光标移动到下一行(相同单元格)而不是光标跟随行到其新的设备(可能会将当前可查看的数据行从屏幕上滚动)。

2 - 编辑一行后,禁用所有排序和过滤,直到用户点击"保存"或者"刷新" (或其他一些选择)?

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

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

我有几个想法(例如,要禁用排序:在我的CellEditEnding事件处理程序中,我可以存储用户排序选项,从每列中清除它们,然后在用户单击“保存/重置”时重新应用它们我可以处理"排序"事件,并在编辑数据时将" e.handled"设置为true ??)。我对WPF和DataGrid这么新,我想知道是否有一个"最佳实践"在那里或我找不到的物业,例如" DisableSorting = true / false" (LOL)。

思考?意见?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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

正如你所看到的,我基本上已经完全解决了原来的问题!如果我能以某种方式“禁用”过滤和排序,但保持数据的排序和过滤!

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

还有其他建议吗?

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