首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用disablecontrols发布正确数据的问题

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

Stack Overflow用户
提问于 2016-08-15 21:53:35
回答 1查看 867关注 0票数 0

在迭代一个Disable/EnableControls()时,我遇到了一些问题,比如在更新字段时使用DataSet。

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

例如,我的数据集中有10条记录。在查看网格和持久化数据时,我运行这个函数,每一行的Cost列值都是相同的,尽管我已经跨过并观察了getNewDataValue函数,它们是不同的值。

代码语言:javascript
复制
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;

我使用Delphi2010、DevExpress量子网格和FIBPlus数据集访问Firebird数据库。

查看文档,我可以看到,当调用DisableControls()时,TDataSet.DataEvent不会将事件传递给DataSources,并且所有主细节关系都会中断,直到调用EnableControls()为止。会不会是我通过DataSet访问DataModule上的DataSource?我试过了,但没什么区别。

如果不使用Disable/EnableControls(),速度是不可用的。因此,任何建议,或者其他快速迭代大型DataSet的方法,都是有帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-16 00:51:28

您正在从循环内部调用EnableControls(),此时它应该位于循环之外(最好是在try..finally块中)。

但是更重要的是,您没有增加NoSelected,所以每次编辑时都访问相同的选定ID。你有两个变量在努力完成一个变量应该自己做的工作。

试一试:

代码语言:javascript
复制
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;

另一种选择是:

代码语言:javascript
复制
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;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38963633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档