是否有任何方法可以保持对TDataset.Edit的调用,同时禁止控件在启用控件时需要进行布局刷新?

时间:2013-03-29 00:13:30

标签: delphi

这有点牵扯,所以请耐心等待。

TDataset.Edit调用SetState(dsEdit);,调用DataEvent(deUpdateState, 0);

TDataSet.DataEvent,当使用deUpdateState参数调用时,如果您已禁用数据集上的控件,则会设置一个标记,当控件重新生成时,该标记将发送deLayoutChange个事件-enabled,根据文档有些模糊地表示“数据感知控件中的数据布局发生了变化。”

当重新启用的控件是数据绑定网格时,这可能会导致一些非常昂贵的重置,从而迫使整个网格重新布局。在具有大量行和列的大型数据集上,这可能需要几秒钟,即使您在禁用影响网格布局的控件时没有执行任何操作。

有没有办法防止这种情况发生? SetState不是虚拟的。 DataEvent是虚拟的,但是用于设置它的FEnableEvent字段无法从派生类访问。如果没有粗暴的话,似乎没有办法解决这个问题。 (RTTI手术,覆盖课程等)有没有人知道更好的方法来实现它?

2 个答案:

答案 0 :(得分:0)

根据您的评论,您的数据集已连接到DevExpress网格,我会开始寻找。使用cxgrid.BeginUpdate和cxgrid.EndUpdate以及try / finally块包装进行编辑的代码。

MycxGrid.BeginUpdate;
try
   {Do some data editing}
finally
  MycxGrid.EndUpdate;
end;

仅此一项就可以解决您的问题。如果没有,请查看DevExpress帮助文件TcxDBDataModeController.SmartRefresh和TcxDBDataModeController.SyncMode。

没有看到你的代码,我只是在猜测。但在我发现BeginUpdate / EndUpdate组合之前,我遇到了非常类似的性能问题。

答案 1 :(得分:0)

我不知道TcxGrid,但也许您可以尝试在控件端解决此问题,并覆盖TcxGrid的{​​{1}}或网格本身的其他方法。

正如DataLink.LayoutChanged类比:

  • TDBGrid是动态的,可以覆盖,以便您可以在TCustomDBGrid.CreateDataLink后代注入自己的TGridDataLink衍生物。
  • TDBGrid是虚拟的,可以覆盖,这是选项1.
  • TGridDataLink.LayoutChanged来电TGridDataLink.LayoutChanged
  • FGrid.LayoutChanged也是虚拟的,使其成为选项2。