这有点牵扯,所以请耐心等待。
TDataset.Edit
调用SetState(dsEdit);
,调用DataEvent(deUpdateState, 0);
TDataSet.DataEvent
,当使用deUpdateState
参数调用时,如果您已禁用数据集上的控件,则会设置一个标记,当控件重新生成时,该标记将发送deLayoutChange
个事件-enabled,根据文档有些模糊地表示“数据感知控件中的数据布局发生了变化。”
当重新启用的控件是数据绑定网格时,这可能会导致一些非常昂贵的重置,从而迫使整个网格重新布局。在具有大量行和列的大型数据集上,这可能需要几秒钟,即使您在禁用影响网格布局的控件时没有执行任何操作。
有没有办法防止这种情况发生? SetState
不是虚拟的。 DataEvent
是虚拟的,但是用于设置它的FEnableEvent
字段无法从派生类访问。如果没有粗暴的话,似乎没有办法解决这个问题。 (RTTI手术,覆盖课程等)有没有人知道更好的方法来实现它?
答案 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。