Проблема с публикацией правильных данных с помощью disablecontrols
У меня были некоторые проблемы с использованием Disable/EnableControls()
во время итерации по DataSet, а именно при обновлении полей.
То, что, кажется, происходит с этими двумя обновленными полями, - то, что они все берут те же самые данные. Похоже, что последнее значение для записи вводится для всех строк. Допустим, у нас есть 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()
называется. Может ли быть так, что я обращаюсь к DataSet на DataModule через DataSource? Я пробовал это, и это не имеет значения.
Без использования Disable/EnableControls()
, скорость непригодна. Так что любой совет или альтернативный способ перебора большого набора данных на скорости, был бы полезен.
1 ответ
Ты звонишь EnableControls()
из цикла, когда он должен быть вне цикла (предпочтительно в try..finally
блок).
Но что более важно, вы не увеличиваете NoSelected
, так что вы всегда получаете доступ к одному и тому же выбранному идентификатору при каждом редактировании. У вас есть две переменные, которые борются за работу, которую одна переменная должна делать сама.
Попробуйте это вместо этого:
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;