复选框状态下的Delphi / DevExpress同步主/详细信息

时间:2018-08-20 17:19:07

标签: delphi devexpress delphi-2010 devexpress-gridcontrol

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

我继承了一些代码,其中程序员在主/明细(客户->设备)关系中有两个网格,他的工作方式如下:

  1. 他将其主TCXGrid数据源属性链接到“客户”数据 源,后者又链接到“客户”表。
  2. 他将自己的详细信息TCXGrid数据源链接到设备数据源, 然后链接到基础设备表。
  3. 为了使真正的Master / Detail魔术发生,他迷上了 客户表的AfterScroll事件并在设备上设置过滤器 基于客户表当前记录中的键的数据集。

代码:

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字段仍返回旧状态。我认为事件没有按照我期望的顺序触发,因此我必须进入全局设置表。我尝试使用以下事件:

  • 设置表AfterPost
  • 设置数据源OnDataChange
  • 设置数据源OnUpdateData
  • 设置数据集AfterPost

在每种情况下,无论事件是否触发,结果都是相同的。尚未设置基础view_inactive表。但是,如果我单击客户网格,那肯定是这样。

我要去哪里错了?

1 个答案:

答案 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;

如果要在全局设置表中加载/保存此设置,请单独进行操作。