4

假设我暂时想在 TClientDataSet 上的耗时操作期间禁用OnCalcFields事件(例如,通过设置)。cdsCalcFields := nil当我重新附加该方法时,如何告诉 TClientDataSet 执行计算字段的重新计算OnCalcFields

另一种可能需要手动重新计算的情况是某些计算字段依赖于其他数据集的情况(例如,计算字段用于临时保存来自其他数据集的某些聚合值)。这在大多数情况下都可以正常工作,因为OnCalcFields事件的执行频率足以从其他数据集中获取正确的值。但在某些情况下,需要重新计算才能从其他数据集中获得正确的值。

AutoCalcFields属性设置为False也可能会使您陷入需要手动重新计算的某些情况。

我已经看到了一些关于如何减少OnCalcFields事件执行的解释,但我找不到一个简单的方法来执行重新计算......

有什么建议么?

4

3 回答 3

6

计算字段是在从数据库中检索记录时计算的,因此Refresh在数据集上调用(或关闭 -> 打开)以强制重新计算。

(关于问题的评论),强制重新计算只能RefreshRecord在数据集上调用的一条记录。如果特定的数据集后代没有实现该方法,则Edit后面的Cancel调用将实现相同的效果。

于 2011-05-26T10:52:36.550 回答
2

调用 Refresh 或 Close-> 会导致整个表从数据库中重新加载。如果这不是您想要的,您可以调用 OnCalc 方法,您自己将其传递给 CDS。尽管您可能必须手动滑动光标。

with DisplayAcctListCDS do begin
  First;
  while not Eof do begin
    Edit;
    DisplayAcctListCDSCalcFields(DisplayAcctListCDS);
    Next;
  end;
end;

假设 DisplayAcctListCDS 是带有计算字段的 TClientDataSet,而 DisplayAcctListCDSCalcFields 是 OnCalcFields 的生成事件方法。

于 2011-12-06T17:26:26.587 回答
0

这有点骇人听闻,但对我来说这个问题的答案是 100%!

DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)
于 2017-09-17T12:11:31.440 回答