2015-11-14 51 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'只是一行类型声明。 –