我有一个叫格在我的应用程序有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'只是一行类型声明。 –