0

Disable/EnableControls()在迭代数据集时遇到了一些问题,即更新字段时。

两个更新的字段似乎发生了什么,它们都在使用相同的数据。看起来正在为所有行输入帖子的最后一个值。因此,假设我们有 3 条记录,它们更新了 1、2 和 3 的值(在我的情况下,所有字段都发布了 3),而我期望最后一个字段是 1、2 和 3。

例如,我的数据集中有 10 条记录。我运行这个函数,在查看网格和持久化数据时Cost,每一行的列值都是相同的,即使我已经逐步检查了getNewDataValue函数,它们是不同的值。

NumberSelected = 0;
dataSourceItems.DataSet.DisableControls; //it this be my problem, accessing the dataset via the datasource? – I tried this and it didn’t make a difference.
while (NumberSelected < cxGridDBTableView1.Controller.SelectedRowCount) do
begin
  Id = cxGridDBTableView1.Controller.SelectedRows[NoSelected]).Values[0];
  if dataSourceItems.DataSet.locate('PK', Id, []) then 
  begin
    dataSourceItems.DataSet.edit;
    dataSourceItems.DataSet.fieldbyname('Cost').asfloat := getNewDataValue;
    dataSourceItems.DataSet.Post;
    inc(NumberSelected)
  end;

  dataSourceItems.DataSet.EnableControls;
end;

我正在使用 Delphi 2010、DevExpress Quantum Grid 和 FIBPlus 数据集,访问 Firebird 数据库。

查看文档,我可以看到当DisableControls()被调用时,TDataSet.DataEvent不会将事件传递给数据源,并且所有主从关系都被破坏,直到EnableControls()被调用。会不会是我通过 DataSource 访问 DataModule 上的 DataSet?我已经尝试过了,它没有任何区别。

不使用Disable/EnableControls(),速度无法使用。因此,任何建议或快速迭代大型 DataSet 的替代方法都会有所帮助。

4

1 回答 1

4

您是EnableControls()从循环内部调用的,而它应该在循环之外(最好是在一个try..finally块中)。

但更重要的是,您并没有递增NoSelected,因此每次进行编辑时总是访问相同的选定 ID。您有两个变量在努力完成一个变量本身应该完成的工作。

试试这个:

NumberSelected = 0;
dataSourceItems.DataSet.DisableControls;
try
  while (NumberSelected < cxGridDBTableView1.Controller.SelectedRowCount) do
  begin
    Id = cxGridDBTableView1.Controller.SelectedRows[NumberSelected]).Values[0];
    if dataSourceItems.DataSet.Locate('PK', Id, []) then 
    begin
      dataSourceItems.DataSet.Edit;
      dataSourceItems.DataSet.FieldByName('Cost').AsFloat := getNewDataValue;
      dataSourceItems.DataSet.Post;
    end;
    Inc(NumberSelected);
  end;
finally
  dataSourceItems.DataSet.EnableControls;
end;

或者:

dataSourceItems.DataSet.DisableControls;
try
  for NumberSelected = 0 to cxGridDBTableView1.Controller.SelectedRowCount-1 do
  begin
    Id = cxGridDBTableView1.Controller.SelectedRows[NumberSelected]).Values[0];
    if dataSourceItems.DataSet.Locate('PK', Id, []) then 
    begin
      dataSourceItems.DataSet.Edit;
      dataSourceItems.DataSet.FieldByName('Cost').AsFloat := getNewDataValue;
      dataSourceItems.DataSet.Post;
    end;
  end;
finally
  dataSourceItems.DataSet.EnableControls;
end;
于 2016-08-16T00:51:28.057 回答