在过滤与DBlookupcombox类型的CxGrid中的列绑定的数据集之后,我将丢失先前选择的lookupdata。 请在下面找到详细信息。
我们有一个带列的cxGrid
ID | Name | Place
1 | abc | Place1
2 | xyz | Place5
3 | lmn |
4 | opq |
5 | rst |
and another table Client
ClientID | Name
1 | abc
2 | xyz
3 | lmn
4 | opq
5 | rst
In database, there is a table PlaceMapping
PlaceMappingID| ClientID | Place
1 | 1 | Place1
2 | 1 | Place2
3 | 2 | Place1
4 | 2 | Place5
5 | 2 | Place6
根据ID我们正在获取" Place"来自表PlaceMapping的DBLookupComboBox类型(在cxgrid的属性下我们有这个选项)。
我们在事件中添加了过滤器" GetPropertiesForEdit" cxGrid列的位置。 Place lookupcombobox获取正确的值 但是,在用户选择任何项目并从所选项目更改焦点后显示。它变得空白。
我曾尝试删除Place列的过滤器,该过滤器工作正常,但它获取了所有值的值。
示例:对于ID" 1"我们使用值Place1和Place2获得lookupcombobox。
ID" 2"我们使用值Place1,Place5,Place6查找。
任何帮助都非常感激。
答案 0 :(得分:1)
有两种方式为我工作:
方式1: 创建两个查找表。第一个表绑定到列的编辑器。它必须包含所有行才能在所有View记录中正确显示查找值。打开后,应将第二个表分配给就地编辑器。此表将被过滤以包含适用于当前字段/记录的有限记录集。
您可以使用包含带有适当参数的WHERE子句的查询来代替过滤表。
方式2: 您可以直接过滤下拉查找网格,而不是创建额外的数据集。此网格包含自己的数据控制器,您可以使用与网格视图类似的所有属性和方法。
共同部分: Table View对象具有OnInitEdit事件,该事件允许您在显示之前设置就地编辑器。您应该使用此事件来填充组合框项目,筛选查找列表以及更改其他编辑器属性。在这种情况下,使用编辑器的OnPopup或OnInitPopup事件是不合适的,原因有两个: a)编辑器需要正确的查找数据来显示编辑框值; b)用户可以在不打开下拉列表的情况下更改编辑值,例如,通过键入列单元格。
在OnInitEdit事件处理程序中,我们: 1)检查列是否是我们需要修改的编辑器; 2)使用当前View记录的值形成辅助查找表的过滤器; 3) 方法1:用数据源替换编辑器的列表源,数据源绑定到过滤(辅助)查找表; 方式2:设置查找数据控制器的过滤器。