2015-11-14 3 views
1

У меня есть TDBGrid под названием сетки в моем приложении с 3 колонками:Получение значения определенного столбца в TDBGrid

EMP_ID EMP_FirstName EMP_LastName 

Моя сетка MultiSelect.

Как я могу получить EMP_ID выбранных строк, когда пользователь нажимает кнопку (я хочу передать их в хранимую процедуру).

ответ

1

Если я понимаю, что вы хотите, код ниже должен помочь.

Строки в выбранном DBGrid записываются в закладки, сохраненные в свойстве SelectedRows. Таким образом, чтобы получить список процедур TForm1.GetBookmarkIDs, какие вам нужно сделать, это:

  • Сохранить текущую позицию в сетке (CDS1.GetBookmark)

  • Iterate единицы хранения SelectedRows' чтобы получить каждую закладку по очереди, получить закладку, получить набор данных, чтобы перейти к этой закладке, и получить EMP_ID для строки набора данных (в моих тестовых данных имя столбца - просто «ID»).

  • делать все, что вы хотите со значением emp_id

  • Возврат к записи мы закладкой в ​​начале

Призывы DisableControls и EnableControls должны ускорить процесс, как они мешают другие данные -aware управления в GUI (а также сетки, конечно) от обновления, пока выбранные строки посещаются.

Код:

procedure TForm1.GetBookmarkIDs; 
var 
    BM, 
    SelectedBM : TBookmark; 
    EMP_ID : Integer; 
    i : Integer; 
begin 
    BM := CDS1.GetBookmark; 
    try 
    CDS1.DisableControls; 
    CDS1.First; 
    for i := 0 to DBGrid1.SelectedRows.Count - 1 do begin 
     SelectedBM := PChar(DBGrid1.SelectedRows[i]); 
     CDS1.GotoBookmark(SelectedBM); 
     EMP_ID := CDS1.FieldByName('ID').AsInteger; 
     Memo1.Lines.Add(IntToStr(EMP_ID)); 
    end; 
    finally 
    CDS1.GotoBookmark(BM); 
    CDS1.FreeBookmark(BM); 
    CDS1.EnableControls; 
    end; 
end; 

Вы не сказали, как именно вам нужно форматировать список EMP_IDs для отправки хранимой процедуры. С помощью вышеуказанного кода вы будете делать что-то вроде вызова Stored Proc каждый раз вокруг цикла «for i: = 0 ...».

Если вы хотите их, скажем, в виде списка, разделенного запятыми, можно переписать процедуру как функцию, возвращающую строку, вдоль этих линий

function TForm1.GetBookmarkIDs : String; 
[...] 
begin 
    Result := ''; 
    [...] 
     //EMP_ID := CDS1.FieldByName('ID').AsInteger; 
     if Result <> '' then 
     Result := Result + ', '; 
     Result := Result + CDS1.FieldByName('ID').AsString; 
     [...] 
+0

Описание хорошо, но код как-то грубо. Я бы предложил метод для общего использования, например 'procedure GetSeletedFieldValueFromGrid (Grid: TDBGrid; const Имя поля: string; out SelectedValues: TVariantDynArray);'. Вы можете получить все необходимое из самой сетки. –

+0

@SirRufo: Да, но OP звучит как новичок («Я код с Delphi 7, For Educational Reasons»), поэтому я подумал, что более важно сосредоточиться на основных деталях того, как получить EMP_ID из строк, а не сетка (что, если выбранные строки являются только верхними и нижними рядами сетки 30000 строк?). В любом случае, я не помню, что D7 поддерживает TVariantDynArray. Это может быть грубо, но я думаю, что лучше отвлечь ОП с помощью тонкостей. Op мог написать более элегантную версию, узнав немного больше. – MartynA

+0

Я бы сказал, что вы можете научить новичка также отношениям между сеткой, DataSource, DataSet с таким распространенным методом. И 'TVariantDynArray' - это всего лишь одна строка объявления типа. –

Смежные вопросы