检查 TClientDataset 中的行是否已更改

Check if row was changed in a TClientDataset

我有一个包含 n 个字段的 TClientDataset,我必须遍历它们以计算有多少已更改但正在执行:

if (Cds.fields1.Value <> Cds.fields1.OldValue) and (Cds.fields2.Value <> Cds.fields2.OldValue) etc....

或者遍历Cds.fields[I]不是很'clean'

有没有Cds.RowChanged方法之类的?

您可以为此使用 TClientDataSet 的 UpdateStatus 属性:

if Cds.UpdateStatus = usModified then
  //  current row was changed

其他可能的值是 usUnmodifiedusInsertedusDeleted。与 TDataSet.Modified 属性 不同,当前行的 UpdateStatus 在其更改已被 CDS.Post 回传到 CDS 后仍然存在。显然,这取决于您的应用程序需要哪些数值。

如联机帮助中所述,您可以使用 UpdateStatus 设置计算字段的值:

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  case TClientDataSet(DataSet).UpdateStatus of
    usUnmodified: FieldByName('Status').AsString := '';
    usModified: FieldByName('Status').AsString := 'M';
    usInserted: FieldByName('Status').AsString := 'I';
    usDeleted: FieldByName('Status').AsString := 'D';
  end;
end;

您还可以使用它的 StatusFilter 属性 临时过滤 TClientDataSet 到 select 具有特定 UpdateStatus:

的行
procedure TCDSForm.Button1Click(Sender: TObject);
begin
  if CDS.StatusFilter = [] then
    CDS.StatusFilter := [usModified]
  else
    CDS.StatusFilter := [];
  Caption := IntToStr(CDS.RecordCount);
end;

请注意 CDS.RecordCountStatusFilter 设置为 usModified 不一定 return 与 CDS.ChangeCount 属性 相同的值,因为 ChangeCount 值包括 inserted 的行数以及 modified.

的行数

你不必遍历数据集,你可以使用 ChangeCount 属性.