版本信息:Delphi 2010,Express Quantum GridSuite 6.56
我继承了一些代码,其中程序员在主/详细信息(客户->设备)关系中有两个网格,他使这项工作像这样:
- 他将他的主 TCXGrid 数据源属性链接到 Customer 数据源,该数据源又链接到 Customer 表。
- 他将他的详细 TCXGrid DataSource 链接到 Device 数据源,然后链接到底层的 Device Table。
- 为了实现真正的 Master/Detail 魔术,他连接到 Customer 表的 AfterScroll 事件,并根据 Customer 表的当前记录中的键在 Device 数据集上设置一个过滤器。
编码:
procedure TdmData.tblCustomerAfterScroll(DataSet: TDataSet);
begin
if tblDevices.Active then
begin
tblDevices.filter := 'DCKEY=' +
inttostr(DataSet.FieldbyName('CKEY').AsInteger)
{+ ViewInactiveString}; //my addition
tblDevices.Filtered:=True;
end;
end;
这行得通。(也就是说,当用户单击客户网格时,设备网格会更改为仅显示该客户的设备。)
我的任务是为非活动设备添加一个额外的(全局)过滤器。所以我在这个主/详细页面上创建了一个复选框,链接到一个全局设置表,链接到一个名为 view_inactive 的字段。我已添加到步骤 3 中描述的过滤器。
function TdmData.ViewInactiveString: String;
begin
if not tblSettingsVIEW_INACTIVE.AsBoolean
then Result := ' AND ACTIVE <> FALSE'
else Result := '';
end;
这也适用于当用户单击客户网格时,设备网格会显示在该客户的非活动设备上。但是设备网格不会更新,直到用户单击客户网格,我希望它立即更新。
我连接到复选框 OnClick 以调用客户的 AfterScroll 方法,但这不会更新详细信息网格。我注意到这似乎是因为绑定的 view_inactive 字段仍在返回旧状态。我认为事件没有按我期望的顺序触发,所以我必须挂钩到全局设置表。我尝试使用以下事件:
- 设置表 AfterPost
- 设置数据源 OnDataChange
- 设置数据源 OnUpdateData
- 设置数据集 AfterPost
在每种情况下,无论是否触发事件,结果都是相同的。基础 view_inactive 表尚未设置。但是,如果我单击客户网格,它会以某种方式出现。
我哪里错了?