检查TClientDataset中是否更改了行

时间:2016-07-08 14:36:31

标签: delphi tclientdataset

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

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

或循环通过Cds.fields [I]不是很干净&#39;

是否有Cds.RowChanged方法?

2 个答案:

答案 0 :(得分:12)

您可以使用TClientDataSet的DirectoryStream.Filter<Path> visibleFilter = new DirectoryStream.Filter<Path>() { @Override public boolean accept(Path file) { try { return Files.isDirectory(file)); } catch(IOException e) { e.printStackTrace(); } return false; } try(DirectoryStream<Path> stream = Files.newDirectoryStream(directory.toPath(), visibleFilter)) { for(Path file : stream) { folders.push(child); } } 属性:

UpdateStatus

其他可能的值包括if Cds.UpdateStatus = usModified then // current row was changed usUnmodifiedusInserted。与usDeleted属性不同,当前行的TDataSet.Modified在其更改已由CDS.Post回发到CDS后仍然存在。显然,取决于您应用程序所需的这些数值中的哪一个。

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

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; 属性临时过滤TClientDataSet,以选择具有特定StatusFilter的行:

UpdateStatus

请注意,procedure TCDSForm.Button1Click(Sender: TObject); begin if CDS.StatusFilter = [] then CDS.StatusFilter := [usModified] else CDS.StatusFilter := []; Caption := IntToStr(CDS.RecordCount); end; 设置为CDS.RecordCount的{​​{1}}不一定会返回与StatusFilter属性相同的值,因为usModified值包含行数已插入以及已修改的数量。

答案 1 :(得分:2)

您不必遍历数据集,可以使用ChangeCount属性。