版本信息:Delphi 2010,Express Quantum GridSuite 6.56
我继承了一些代码,其中程序员在主/明细(客户->设备)关系中有两个网格,他的工作方式如下:
代码:
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;
从用户单击“客户”网格时,“设备”网格会在该客户的非活动设备上显示时,它也可以正常工作。 但是“设备”网格不会更新 UNTIL ,用户单击“客户”网格时,我希望它立即更新。
我迷上了OnClick复选框以调用客户的AfterScroll方法,但这不会更新详细信息网格。我注意到这似乎是因为绑定的view_inactive字段仍返回旧状态。我认为事件没有按照我期望的顺序触发,因此我必须进入全局设置表。我尝试使用以下事件:
在每种情况下,无论事件是否触发,结果都是相同的。尚未设置基础view_inactive表。但是,如果我单击客户网格,那肯定是这样。
我要去哪里错了?
答案 0 :(得分:1)
在我看来,就像您在使事情复杂化一样。忽略全局设置表。将这样的内容放入新过程中,然后从AfterScroll中调用tblCustomer,在OnClick中选中该复选框,并在tblDevices处于活动状态时调用它。
if tblDevices.Active then
begin
tblDevices.filter := 'DCKEY=' + inttostr(DataSet.FieldbyName('CKEY').AsInteger);
if not CheckboxViewInActive.checked then Devices.filter := theDevices.Filter +' AND ACTIVE <> FALSE';
tblDevices.Filtered:=True;
end;
如果要在全局设置表中加载/保存此设置,请单独进行操作。