这有点复杂,所以请耐心等待。
TDataset.Edit
调用 SetState(dsEdit);
,后者调用 DataEvent(deUpdateState, 0);
TDataSet.DataEvent
,当使用 deUpdateState
参数调用时,如果您禁用了数据集上的控件,它会设置一个标志,该标志将围绕 发送>deLayoutChange
事件,当控件重新启用时,根据文档,这有点模糊地表示“数据感知控件中的数据布局发生了变化。”
当重新启用的控件是数据绑定(bind)网格时,这可能会导致一些非常昂贵的重置,迫使整个网格重新布局。在具有大量行和列的大型数据集上,即使您在禁用影响网格布局的控件时没有执行任何操作,这也可能需要几秒钟的时间。
有什么办法可以避免这种情况发生吗? SetState
不是虚拟的。 DataEvent
是虚拟的,但它用于设置它的 FEnableEvent
字段无法从派生类访问。似乎没有任何方法可以在不进行严重黑客攻击的情况下解决这个问题。 (RTTI 手术、覆盖类(class)等)有人知道更好的方法来实现它吗?
最佳答案
根据您的评论,您的数据集已连接到 DevExpress 网格,我将开始在那里查找。使用 cxgrid.BeginUpdate 和 cxgrid.EndUpdate 以及 try/finally block 包装进行编辑的代码。
MycxGrid.BeginUpdate;
try
{Do some data editing}
finally
MycxGrid.EndUpdate;
end;
仅此一项就可以解决您的问题。如果没有,请查看 DevExpress 帮助文件 TcxDBDataModeController.SmartRefresh 和 TcxDBDataModeController.SyncMode。
没有看到你的代码我只是猜测。但在我发现 BeginUpdate/EndUpdate 组合之前,我遇到了与您非常相似的性能问题。
关于delphi - 当控件被禁用时,是否有任何方法可以保持对 TDataset.Edit 的调用,从而在启用控件时要求布局刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15694378/