使用 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;
我在迭代数据集时遇到了一些使用 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;