如何解决如何手动执行“ OnCalcFields”事件?
| 假设我暂时想在TClientDataSet上的耗时操作期间禁用OnCalcFields
事件(例如,通过设置cdsCalcFields := nil
)。重新附加“ 0”方法时,如何告诉TClientDataSet对计算的字段执行重新计算?
可能需要手动重新计算的另一种情况是某些计算字段依赖于其他数据集的情况(例如,使用计算字段临时保存来自其他数据集的某些聚合值)。在大多数情况下,这样做会很好,因为经常执行“ 0”事件以从其他数据集中获取正确的值。但是在某些情况下,必须重新计算才能从其他数据集中获得正确的值。
将AutoCalcFields
属性设置为False
也可能会使您陷入需要手动重新计算的情况。
我已经看到了有关如何减少OnCalcFields
事件的执行的几种解释,但是我找不到简单的方法来执行重新计算...
有什么建议么?
解决方法
从数据库中检索记录时将计算计算出的字段,因此在数据集上调用
Refresh
(或“关闭”->“打开”)以强制重新计算。
(关于问题的评论),要仅对一条记录进行重新计算,可以在数据集中调用RefreshRecord
。如果特定的数据集后代未实现该方法,则在调用“ 9”后再调用“ 10”将达到相同的目的。
,调用Refresh或Close->可能导致整个表从数据库中重新加载。如果这不是您想要的,则可以仅通过自己的CDS调用OnCalc方法。尽管您可能必须手动滑动光标。
with DisplayAcctListCDS do begin
First;
while not Eof do begin
Edit;
DisplayAcctListCDSCalcFields(DisplayAcctListCDS);
Next;
end;
end;
假设DisplayAcctListCDS是包含计算字段的TClientDataSet,而DisplayAcctListCDSCalcFields是OnCalcFields的生成事件方法。
,这有点骇人听闻,但对我来说,此问题的答案是100%!
DBGrid.Height := 30;
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。