我有一個叫格在我的應用程序有3列TDBGRID:檢索特定列的值在TDBGrid中
EMP_ID EMP_FirstName EMP_LastName
我的網格是多選。
我怎樣才能獲得所選行的EMP_ID當用戶點擊一個按鈕(我想將它們傳遞給存儲過程)。
我有一個叫格在我的應用程序有3列TDBGRID:檢索特定列的值在TDBGrid中
EMP_ID EMP_FirstName EMP_LastName
我的網格是多選。
我怎樣才能獲得所選行的EMP_ID當用戶點擊一個按鈕(我想將它們傳遞給存儲過程)。
如果我明白你想要什麼,下面的代碼應該有所幫助。
在一個DBGrid被選擇的行被記錄在存儲在其SelectedRows屬性的書籤。因此,要獲得該程序TForm1.GetBookmarkIDs的名單,什麼 你需要做的是:
保存在網格的當前位置(CDS1.GetBookmark)
反覆調整SelectedRows'項目依次獲取每個書籤,獲取書籤,獲取數據集以轉到該書籤並獲取數據集行的EMP_ID(在我的測試數據中,列名恰好是'ID')。
什麼就做什麼,你與EMP_ID值喜歡
回到我們一開始
到DisableControls和EnableControls的調用書籤記錄,因爲它們阻止其他數據來加快速度在訪問所選行時更新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的名單發送到存儲過程。通過上面的代碼,你可以做一些事情,比如每次圍繞「for i:= 0 ...」循環調用Stored Proc。
如果你想他們,說,作爲一個逗號分隔的列表,你可以重寫程序爲返回一個字符串的函數,沿着這些線路
function TForm1.GetBookmarkIDs : String;
[...]
begin
Result := '';
[...]
//EMP_ID := CDS1.FieldByName('ID').AsInteger;
if Result <> '' then
Result := Result + ', ';
Result := Result + CDS1.FieldByName('ID').AsString;
[...]
的描述確定,但該代碼是有點粗糙。我會提出一個像''GetSeletedFieldValueFromGrid(Grid:TDBGrid; const Fieldname:string; out SelectedValues:TVariantDynArray)''這樣的常用方法。你可以從網格中獲得你需要的一切。 –
@SirRufo:是的,但OP聽起來像是一個新手(「我使用Delphi 7編碼,爲了教育理由」),所以我認爲更重要的是集中處理如何從行中獲取EMP_ID的基本細節,而不是網格(如果選定的行只是30000行網格的頂部和底部行?)。無論如何,我不記得D7支持TVariantDynArray。它可能是粗略的,但我認爲這更好地分散操作系統與細微之處。一旦學到更多,Op可以寫出更優雅的版本。 – MartynA
我會說,你可以教新手也使用這種常見的方法,網格,數據源,數據集之間的關係。 'TVariantDynArray'只是一行類型聲明。 –