在迭代一个Disable/EnableControls()时,我遇到了一些问题,比如在更新字段时使用DataSet。
这两个更新的字段似乎正在发生的情况是,它们都在获取相同的数据。它看起来是为所有行输入post的最后一个值。因此,假设我们有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;我使用Delphi2010、DevExpress量子网格和FIBPlus数据集访问Firebird数据库。
查看文档,我可以看到,当调用DisableControls()时,TDataSet.DataEvent不会将事件传递给DataSources,并且所有主细节关系都会中断,直到调用EnableControls()为止。会不会是我通过DataSet访问DataModule上的DataSource?我试过了,但没什么区别。
如果不使用Disable/EnableControls(),速度是不可用的。因此,任何建议,或者其他快速迭代大型DataSet的方法,都是有帮助的。
发布于 2016-08-16 00:51:28
您正在从循环内部调用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;https://stackoverflow.com/questions/38963633
复制相似问题