Проблема с публикацией правильных данных с помощью 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;
Другие вопросы по тегам