2015-11-14 63 views
1

我有一個叫格在我的應用程序有3列TDBGRID:檢索特定列的值在TDBGrid中

EMP_ID EMP_FirstName EMP_LastName 

我的網格是多選。

我怎樣才能獲得所選行的EMP_ID當用戶點擊一個按鈕(我想將它們傳遞給存儲過程)。

回答

1

如果我明白你想要什麼,下面的代碼應該有所幫助。

在一個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; 
     [...] 
+0

的描述確定,但該代碼是有點粗糙。我會提出一個像''GetSeletedFieldValueFromGrid(Grid:TDBGrid; const Fieldname:string; out SelectedValues:TVariantDynArray)''這樣的常用方法。你可以從網格中獲得你需要的一切。 –

+0

@SirRufo:是的,但OP聽起來像是一個新手(「我使用Delphi 7編碼,爲了教育理由」),所以我認爲更重要的是集中處理如何從行中獲取EMP_ID的基本細節,而不是網格(如果選定的行只是30000行網格的頂部和底部行?)。無論如何,我不記得D7支持TVariantDynArray。它可能是粗略的,但我認爲這更好地分散操作系統與細微之處。一旦學到更多,Op可以寫出更優雅的版本。 – MartynA

+0

我會說,你可以教新手也使用這種常見的方法,網格,數據源,數據集之間的關係。 'TVariantDynArray'只是一行類型聲明。 –