使用 disablecontrols 发布正确数据的问题

Issue with posting correct data with disablecontrols

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

这两个更新字段似乎正在发生的事情是,它们都采用相同的数据。看起来正在为所有行输入 post 的最后一个值。假设我们有 3 条记录,它们的更新值分别为 1、2 和 3(在我的例子中,所有字段都被 post 编辑),而我期望最后一个字段为 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 不会将事件传递给 DataSources,并且所有主要细节关系都被破坏,直到 EnableControls() 叫做。 难道是我通过数据源访问数据模块上的数据集?这个我试过了,没啥区别。

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

您正在从循环 内部 调用 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;