我有一个包含n个字段的TClientDataset,我必须循环遍历它们以计算有多少已更改但正在执行:
if (Cds.fields1.Value <> Cds.fields1.OldValue) and (Cds.fields2.Value <> Cds.fields2.OldValue) etc....
或循环通过Cds.fields [I]不是很干净&#39;
是否有Cds.RowChanged方法?
答案 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
,usUnmodified
和usInserted
。与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属性。