Получение содержимого грида
Пробую так:
for i := 0 to DBGrid_Reports.DataSource.DataSet.RecordCount - 1 do begin
for j := 0 to DBGrid_Reports.Columns.Count - 1 do begin
arrsRecordsetValues[j] := DBGrid_Reports.Columns.Items[j].Field.Text;
end;
DBGrid_Reports.DataSource.DataSet.Next;
end;
но в результате получаю, что первой строкой получается произвольная строка грида, далее все идет по порядку, а затем, после того, как получаю последнюю строку, она же отображается несколько раз до окончания работы цикла (до получения нужного количества строк).
Что я делаю не так?
Ситуация такая - выполняю запрос (использую DBGrid, TQuery, работаю через ado):
ADOQuery_Main.SQL.Clear();
ADOQuery_Main.SQL.Add(ocApp.sACTIVE_GRID_REQUEST);
ADOQuery_Main.Active := true;
Соответственно пользователю предоставляется возможность увидеть данные в гриде. Далее, если увиденное пользователя устраивает (по ряду критериев), он должен еще и анализировать информацию.
Здесь мне нужно еще и обработать данные, представив их в другой удобной пользователю форме. Накладно выполнять еще один запрос к БД - слишком большие затраты по времени. Я хочу просто вытащить уже полученные данные из грида.
Пробую так:
nRecordsCount := DataModule_Main.DataSource_Main.DataSet.RecordCount;
nFieldsCount := DataModule_Main.DataSource_Main.DataSet.FieldCount;
for i := 0 to nRecordsCount - 1 do begin
for j := 0 to nFieldsCount - 1 do begin
arrsRecordsetValues[j] := DataModule_Main.DataSource_Main.DataSet.Fields[j].Value;
end;
frmMain.DBGrid_Reports.DataSource.DataSet.MoveBy(1);
end;
Но это, если я правильно понимаю то же самое...
:) и в самом деле. разобрался. только вот теперь получается что:
когда я вычитываю строки, грид, который подключен к этому DataSet, последовательно прогоняется по всем записям. можно как то этого избежать?
когда я вычитываю строки, грид, который подключен к этому DataSet, последовательно прогоняется по всем записям. можно как то этого избежать?
Нет. Грид напрямую железно связан с источником данных. Поэтому при перемещении по записям в источнике данных меняются и текущая стора в гриде. Единственное что могу порекомендовать - запоминать начальную позицию в гриде (или источнике данных), и после всех твоих "махинаций" ( :) ) возвращаться на эту строку.
begin
Table1.DisableControls;
index:=Table1.RecNo;
// твои действия
Table1.RecNo:=index;
Table1.EnableControls;
У меня используется таблица, но с тем же успехом можно использовать любой источник данных.
begin
Table1.DisableControls;
index:=Table1.RecNo;
// твои действия
Table1.RecNo:=index;
Table1.EnableControls;
У меня используется таблица, но с тем же успехом можно использовать любой источник данных.
Спасибо большое! Теперь все работает так, как того и хотелось.
Пожалуста!
Но правильнее будет
begin
Table1.DisableControls;
index:=Table1.RecNo;
try
// твои действия
finally
Table1.RecNo:=index;
Table1.EnableControls;
end;
Т.к. если в превидущем варианте кода в твоих операциях произойдёт ошибка, то визуальные эллементы остануться не активными, а так они в любом случае в октивное состояние возвращаются. )