在CxGrid

时间:2017-05-09 10:38:10

标签: delphi devexpress delphi-xe tcxgrid

在过滤与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查找。

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

有两种方式为我工作:

方式1: 创建两个查找表。第一个表绑定到列的编辑器。它必须包含所有行才能在所有View记录中正确显示查找值。打开后,应将第二个表分配给就地编辑器。此表将被过滤以包含适用于当前字段/记录的有限记录集。

您可以使用包含带有适当参数的WHERE子句的查询来代替过滤表。

方式2: 您可以直接过滤下拉查找网格,而不是创建额外的数据集。此网格包含自己的数据控制器,您可以使用与网格视图类似的所有属性和方法。

共同部分: Table View对象具有OnInitEdit事件,该事件允许您在显示之前设置就地编辑器。您应该使用此事件来填充组合框项目,筛选查找列表以及更改其他编辑器属性。在这种情况下,使用编辑器的OnPopup或OnInitPopup事件是不合适的,原因有两个: a)编辑器需要正确的查找数据来显示编辑框值; b)用户可以在不打开下拉列表的情况下更改编辑值,例如,通过键入列单元格。

在OnInitEdit事件处理程序中,我们: 1)检查列是否是我们需要修改的编辑器; 2)使用当前View记录的值形成辅助查找表的过滤器; 3) 方法1:用数据源替换编辑器的列表源,数据源绑定到过滤(辅助)查找表; 方式2:设置查找数据控制器的过滤器。