【发布时间】:2015-11-14 04:47:27
【问题描述】:
我的应用程序中有一个名为 Grid 的 TDBGRID,它有 3 列:
EMP_ID EMP_FirstName EMP_LastName
我的网格是多选的。
当用户单击按钮时,如何获取所选行的 EMP_ID(我想将它们传递给存储过程)。
【问题讨论】:
标签: delphi delphi-7 multi-select tdbgrid
我的应用程序中有一个名为 Grid 的 TDBGRID,它有 3 列:
EMP_ID EMP_FirstName EMP_LastName
我的网格是多选的。
当用户单击按钮时,如何获取所选行的 EMP_ID(我想将它们传递给存储过程)。
【问题讨论】:
标签: delphi delphi-7 multi-select tdbgrid
如果我理解您想要什么,下面的代码应该会有所帮助。
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_ID 列表以发送到存储过程。使用上面的代码,您可以在“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;
[...]
【讨论】:
procedure GetSeletedFieldValueFromGrid(Grid:TDBGrid; const Fieldname:string; out SelectedValues: TVariantDynArray);。您可以从网格本身获得所需的一切。
TVariantDynArray 只是一行类型声明。