检查 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
其他可能的值是 usUnmodified
、usInserted
和 usDeleted
。与 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.RecordCount
与 StatusFilter
设置为 usModified
不一定 return 与 CDS.ChangeCount
属性 相同的值,因为 ChangeCount
值包括 inserted 的行数以及 modified.
的行数
你不必遍历数据集,你可以使用 ChangeCount 属性.
我有一个包含 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
其他可能的值是 usUnmodified
、usInserted
和 usDeleted
。与 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.RecordCount
与 StatusFilter
设置为 usModified
不一定 return 与 CDS.ChangeCount
属性 相同的值,因为 ChangeCount
值包括 inserted 的行数以及 modified.
你不必遍历数据集,你可以使用 ChangeCount 属性.