【问题标题】:Retrieving the values of a specific column in a TDBGrid检索 TDBGrid 中特定列的值
【发布时间】:2015-11-14 04:47:27
【问题描述】:

我的应用程序中有一个名为 Grid 的 TDBGRID,它有 3 列:

EMP_ID    EMP_FirstName    EMP_LastName

我的网格是多选的。

当用户单击按钮时,如何获取所选行的 EMP_ID(我想将它们传递给存储过程)。

【问题讨论】:

    标签: delphi delphi-7 multi-select tdbgrid


    【解决方案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_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);。您可以从网格本身获得所需的一切。
    • @SirRufo:是的,但是 OP 听起来像个新手(“我用 Delphi 7 编码,出于教育原因”),所以我认为更重要的是专注于如何获取的基本细节来自行而不是网格的 EMP_ID(如果选定的行只是 30000 行网格的顶部和底部行怎么办?)。无论如何,我不记得 D7 支持 TVariantDynArray。可能很粗糙,但我认为这比用细节分散 OP 的注意力更好。学了一点,Op 可以写出更优雅的版本。
    • 我想说,你也可以用这种常用的方法教新手Grid、DataSource、DataSet之间的关系。而TVariantDynArray 只是一行类型声明。
    • 这回答了你的问题吗?
    • 这一行:SelectedBM := PChar(DBGrid1.SelectedRows[i]);给我不兼容的类型错误..因为第一个是 Tarray,第二个是 PWideChar
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2014-05-25
    • 2016-01-31
    • 2020-06-25
    • 2011-01-15
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多