delphi - 当控件被禁用时,是否有任何方法可以保持对 TDataset.Edit 的调用,从而在启用控件时要求布局刷新?

标签 delphi

这有点复杂,所以请耐心等待。

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/

相关文章:

delphi - 从 Delphi 字符串中检测和检索代码点和代理项

delphi - Delphi 中重复直到中使用的函数 Sleep() 的奇怪行为

arrays - Delphi 中的 Length() 函数如何工作?

delphi - 如何从 TDictionary 获取 key ?

multithreading - 如何在 Delphi 中实现线程安全列表包装器?

delphi - 将tList <string>写入tFileStream

delphi - 解释 GetKeyState/GetCursorPos 的错误

delphi - TPaintBox 到 JPEG/BMP - 缓冲区

delphi - 需要在我的 Delphi xe4 IDE 中识别这个 'appearing before compilation' 对话框

delphi - 在DeleteFile()之前是否必须检查FileExists()?