4

这有点涉及,所以请耐心等待。

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

TDataSet.DataEvent,当使用参数调用时deUpdateState,如果您禁用了数据集上的控件,它会设置一个标志,deLayoutChange当控件重新启用时将发送一个事件,根据文档,这有点模糊地表示“数据的布局数据感知控件发生了变化。”

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

有什么办法可以防止这种情况发生吗? SetState不是虚拟的。 DataEvent是虚拟的,但FEnableEvent它用来设置它的字段不能从派生类访问。如果没有严重的黑客行为,似乎没有任何方法可以解决这个问题。(RTTI 手术、叠加课程等)有人知道更好的方法吗?

4

2 回答 2

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 组合之前,我遇到了与您非常相似的性能问题。

于 2013-03-29T19:04:32.727 回答
0

我不知道 TcxGrid,但也许你可以尝试在控件端解决这个问题,并覆盖TcxGrid'sDataLink.LayoutChanged或网格本身的其他方法。

类比TDBGrid

  • TCustomDBGrid.CreateDataLink是动态的并且可以被覆盖,这样你就可以在后代上注入你自己的TGridDataLink衍生物。TDBGrid
  • TGridDataLink.LayoutChanged是虚拟的并且可以被覆盖,这是选项 1。
  • TGridDataLink.LayoutChanged来电FGrid.LayoutChanged
  • TCustomDBGrid.LayoutChanged也是虚拟的,使其成为选项 2。
于 2013-03-29T21:33:29.110 回答