0

版本信息:Delphi 2010,Express Quantum GridSuite 6.56

我继承了一些代码,其中程序员在主/详细信息(客户->设备)关系中有两个网格,他使这项工作像这样:

  1. 他将他的主 TCXGrid 数据源属性链接到 Customer 数据源,该数据源又链接到 Customer 表。
  2. 他将他的详细 TCXGrid DataSource 链接到 Device 数据源,然后链接到底层的 Device Table。
  3. 为了实现真正的 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 表尚未设置。但是,如果我单击客户网格,它会以某种方式出现。

我哪里错了?

4

1 回答 1

1

在我看来,你把事情复杂化了。忽略全局设置表。将类似的内容放在一个新过程中,并从 tblCustomer 的 AfterScroll、复选框的 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;

如果您想在全局设置表中加载/保存此设置,请单独执行。

于 2018-08-21T11:59:55.540 回答