【问题标题】:Correct method of Master / Detail changesMaster / Detail更改的正确方法
【发布时间】:2014-05-10 22:39:02
【问题描述】:

我有两个带有链接字段的表 tblMaster 和 tblDetail,它们都很好用。但在极少数情况下,我需要查看所有未链接的详细信息文件。

我试过了……

OnButton1Click(Sender...
begin
  try
    tblDetail.DisableControls;
    if Button1.Down then
      tblDetail.MasterSource:=nil else
      tblDetail.MasterSource:=srcMaster;
  finally
    tblDetail.EnableControls;
  end;

这可以满足我的需要,但是表格中有很多记录需要很长时间。

代替MasterSource,我也试过

tblDetail.LinkedFields:='' else
tblDetail.LinkedFields:='LinkID';

结果大致相同。

是否有更快的方法来链接/取消链接文件显示?

使用 D5、Zeos 6 和 SQLite3。

【问题讨论】:

  • 不相关,但 tblDetail.DisableControls 应该在您的 try 语句之前(外部),而不是之后(内部)。
  • 很多记录从数据库到你的应用程序需要很长时间。
  • 你为什么没有两张桌子。一个链接,第二个不链接。然后只需将您的数据源切换到另一个表。
  • @Graymatter 谢谢,没想到这一点,但开销很大。我会弄乱它和约翰提到的两个网格。
  • @JerryDodge 谢谢杰瑞,但我是从记忆中输入的,而不是复制/粘贴而不是思考,将禁用放在错误的位置。在真正的代码中它应该在哪里,但是感谢您提到它,因为我不可能在此处显示它。 :)

标签: delphi master-detail delphi-5


【解决方案1】:

您正在切换明细表进入和退出过滤模式。 这种切换是占用时间的。 因为切换会导致数据库刷新。

根据greymatter 的建议,您最好使用TTable 的一个永久链接到主表并且一个免费的。

另一种加快速度的方法是拥有 2 个 TDbGrid。 一个可见,另一个隐藏。 如果要显示所有记录,请隐藏链接到明细表的网格并显示链接到空闲表的网格,反之亦然。

这样您就不会产生转换成本。 您可能希望记住在交换之前同步显示和隐藏网格(如果可能)上的活动行。否则,用户可能会看到行跳跃太多。

显然,您需要禁用(灰显)主表的网格,以便让用户知道他现在正在自己查看详细表而不进行过滤。

最后另一种选择是放弃主从细节并显示两个表的连接视图。 这意味着主表中的行将重复。 就像是。

select d.d1, d.d2, d.id, m.m1 from detail d
left join master m on (m.id = d.masterid)

这在您的应用程序中是否有意义,您必须做出决定。

【讨论】:

  • 谢谢,我已经有了一个未过滤显示的视觉指示器,以便为用户覆盖。我没有想到这两个网格,但会弄乱它,看看我喜欢它。自从发布原始问题以来,我已经添加了一个 ProgressBar,以便用户可以观看某些内容,但我仍然不喜欢滞后,这两个表会解决这个问题。
  • 请注意,这两个表不是免费的。一般来说,它们可能会增加延迟,因为现在有两个表需要保持最新。这可能很明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
相关资源
最近更新 更多