如何使组合框列仅显示未选中的项目

本文关键字:项目 显示 何使 组合 | 更新日期: 2023-09-27 18:24:43

它应该是一个非常常见的工作流,所以我很惊讶C#网格视图和DevExpress都没有提供一种简单的方法来实现它。

示例:
MyColumn是组合框类型列的字段。当用户试图编辑此字段中的值时,他必须在下拉列表中选择一个值。当网格有1行时,他可以从"值A"、"值B"或"值C"中进行选择。如果用户在第一行中选择了"值A",那么在第二行中,MyColumn的可用值将变为"值B"answers"值C"。

目前,我使用DevExpress的方式很糟糕,每次删除、插入或修改操作后,我都会计算组合框存储库(modify RepositoryItemComboBox.Items属性),并在CustomRowCellEdit事件处理程序中将更新的存储库分配给列。代码非常复杂和脆弱。

------更新------我刚刚提出了一个更好的用例示例:假设网格要求用户选择他最喜欢的5个美国州。因此State列是一个combobox类型的列,最初有一个50个状态的列表。如果用户为第一行选择CA,那么在第二行中,他将只有49个状态可供选择。在这种情况下,您总是希望值在每一行中都是唯一的,否则就没有意义了。

如何使组合框列仅显示未选中的项目

您可能已经想到了;但以防万一,如果你还没有:

我认为,与其每次都试图更改存储库,不如在组合框中实际验证所选值(在组合框的onchange事件中),并覆盖用户对此项目的选择,以防它重复。

注意:另外,我认为更改存储库也会有自己的问题;因为每次删除、插入或修改DataSource后都会更改其他组合框中的数据(显然,这里我假设所有组合框都使用相同的DataSource)。

我有一个解决方案。

处理CustomRowCellEditForEditing事件。在处理程序中,遍历所有行并获取所有选定项,然后从repositoryItemComboBox1.items中删除选定项(假设这是您的列编辑器)
当然,逻辑稍微复杂一些,因为当用户编辑或删除一行时,您还必须更改Items集合。

注意:
CustomRowCellEdit是错误的做法因为每次更改RepositoryItemComboBox.Items时,事件都会触发。