我有ClientDatSet
个fkInternalCalc
个字段。 CDS与任何提供商均无关联;而是它在飞行中填充。如何强制CDS重新计算所有“可计算”字段?我无法调用Refresh()
,因为没有提供程序可以刷新数据。到目前为止,我唯一的方法是浏览所有记录,这不是最佳方式。
PS:我已阅读this question和this post,但我希望能有更优雅的方式。
答案 0 :(得分:8)
我用帮助(在这里剥离必要的)来实现这一点,这允许在没有任何黑客攻击的情况下调用受保护的方法。确保在OnCalcFields中为fkInternalCalc字段检查DataSet.State = dsInternalCalc
。
type
TClientDataSetHelper = class helper for TClientDataSet
public
function AssureEditing: Boolean;
procedure InternalCalc;
end;
function TClientDataSetHelper.AssureEditing: Boolean;
begin
result := not (State in [dsEdit, dsInsert]);
if result then
Edit;
end;
procedure TClientDataSetHelper.InternalCalc;
var
needsPost: Boolean;
saveState: TDataSetState;
begin
needsPost := AssureEditing;
saveState := setTempState(dsInternalCalc);
try
RefreshInternalCalcFields(ActiveBuffer);
finally
RestoreState(saveState);
end;
if needsPost then
Post;
end;
使用CalculateFields
可以轻松扩展常规计算字段。虽然这不是必需的,因为只要任何其他数据字段发生变化,就会重新计算计算字段。
答案 1 :(得分:-1)
这有点像黑客,但它有效!
DBGrid.Height := 30;
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)