DataSet 的 DisableControls 的问题

概念:

对大量的数据做循环处理时,为了避免 DataSet 在游标不停地跑时,数据敏感控件随之不停刷新界面,导致代码运行速度下降,通常的做法是断开数据敏感控件和 DataSet 的连接。

正确的做法是执行 DataSet.DisableControls;在循环跑完后再执行 DataSet.EnableControls 恢复对界面上数据敏感控件的刷新支持。

做法:

在 Delphi 里面,假设我们使用一个 DBGrid1 --> DataSource1 --> ClientDataSet1,然后要对 ClientDataSet1 做一个循环操作:

with ClientDataSet1 do
begin
  DisableControls;
  First;
  while not Eof do
  begin
    do something....
    Next;
  end;

  EnableControls;
end;

上述代码没有问题。当然,记得加上 try... finally...end;

但是,如果是主从表。比如我们有一个 ClientDataSet2,设置主从关系:

ClientDataSet2.IndexFieldNames := 'ID';
ClientDataSet2.MasterFields := 'ID';
ClientDataSet2.MasterSource := DataSource1;

则,正常情况下,ClientDataSet1 的游标走动,会自动带动 ClientDataSet2 的数据集被主表 ClientDataSet1 的 ID 字段值过滤掉。

但是,如果对 ClientDataSet1 执行了 DisableControls 则 ClientDataSet2.MasterSource := DataSource1 无效了。这时候,ClientDataSet2 不会随着 ClientDataSet1 的游标走动而变化。

问题总结:

看起来,DisableControls 实际上就是导致 ClientDataSet1 和绑定它的 DataSource1 断开了连接!这样才导致 ClientDataSet2 无法作为从表跟随主表动作。

因此,DisableControls 方法使得界面上数据敏感控件不跟随 DataSet 的游标走动而改变显示,其本质是 DataSet 断开了指向它的 DataSource 的连接。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值