【问题标题】:How Add pickup list to DBGrid at run time?如何在运行时将拾取列表添加到 DBGrid?
【发布时间】:2014-07-25 16:28:28
【问题描述】:

我有一个 DBGrid,当我在运行时分配 SQLQuery 时,它链接到客户端数据集 DBGrid 自动分配没有列。我需要的是当 DBGrid 自动分配列时,我需要设置这些列之一来分配选择列表。 谁能帮我? 以下过程在显示事件的表单中调用。该表单包含 DataSource、ClientDataSet、SQLViewQuery (TSQLQuery)、DatasetProvider 和 DBGridDetails (TDBGrid)。

procedure TViewDetailsForm.ViewPendingAndReturnCheques;
var I : Integer;
slPickList:TStringList;
begin
  slPickList := TStringList.Create;
  slPickList.Add('Pending');
  slPickList.Add('Returned');
  slPickList.Add('Passed');

  SQL := 'SELECT a.CHEQUE_NO, a.BANK, a.CHEQUE_DATE, a.AMOUNT,a.STATUS FROM CHEQUES a';

  //refreshisng the DBGrid
  SQLViewQuery.SQL.Clear;
  SQLViewQuery.SQL.Add(SQL);
  ClientDataSet.Active := false;
  ClientDataSet.Active := true;

  DBGridDetails.Columns[0].Width := _Block;
  DBGridDetails.Columns[1].Width := _Block;
  DBGridDetails.Columns[2].Width := _Block;
  DBGridDetails.Columns[3].Width := _Block;
  DBGridDetails.Columns[4].Width := _Block;


  for I := 0 to DBGridDetails.Columns.Count - 1 do
  begin
    if DBGridDetails.Columns[I].FieldName = 'STATUS' then
    begin
       DBGridDetails.Columns[i].ButtonStyle := cbsAuto;
       DBGridDetails.Columns[I].PickList := slPickList;
    end;
  end;

  Show;

end;

【问题讨论】:

  • 你见过this tutorial吗?
  • “但不起作用”没有帮助。如果您尝试过某些东西,edit 您的问题包括您尝试过的内容,并解释它是如何不起作用的。您还需要定义“选择列表”。它是硬编码值列表(“选择 A、选择 B、选择 C”),还是来自另一个表的值列表?
  • 我添加了我的代码 _Block = 70 (Const)

标签: delphi delphi-7 delphi-xe


【解决方案1】:

这是我刚刚在 Delphi 2007 中创建的示例应用程序,它演示了如何完成此操作。这是我所做的一切设置:

  1. 点击 IDE 主菜单中的 File->New-VCL​​ Forms Application。
  2. 在表单上放置一个 TClientDataSet、一个 TDataSource 和一个 TDBGrid
  3. 单击表单,然后使用 Object Inspector 创建一个新的 OnCreate 事件处理程序。添加以下代码:

    procedure TForm1.FormCreate(Sender: TObject);
    var
      SL: TStringList;
    begin
      with ClientDataSet1 do
      begin
        FieldDefs.Clear;
        FieldDefs.Add('OrderNo', ftInteger);
        FieldDefs.Add('Status', ftString, 10);
        CreateDataSet;
      end;
      ClientDataSet1.Active := True;
    
      // Connect a datasource to the CDS
      DataSource1.DataSet := ClientDataSet1;
    
      // Connect the grid to that datasource to create the columns.
      DBGrid1.DataSource := DataSource1;
    
      // Create the picklist for the second column (Status)
      SL := TStringList.Create;
      try
        SL.Add('Pending');
        SL.Add('Returned');
        SL.Add('Passed');
        DBGrid1.Columns[1].ButtonStyle := cbsAuto;
        DBGrid1.Columns[1].PickList := SL;
      finally
        SL.Free;
      end;
    end;
    
  4. 运行应用程序,单击网格中的Status 列,您将看到添加到上面PickList 的三个选项。

【讨论】:

  • 激活clientdataset后有什么方法可以设置picklist吗?
  • 我刚刚在上面的代码中这样做了。 (在添加选项列表之前它有ClientDataSet1.Active := True;。)???
  • 您首先定义了列不是吗?在我的情况下,列是根据查询的结果列数创建的。
  • 在设计时我的网格中没有列,ClientDataSet 中也没有。它的工作方式与您的完全相同;这些列是根据我在代码中添加的新列创建的,这完全就像基于分配查询来创建它们。
【解决方案2】:

您可以在运行时将值分配给 dbgrid 列选择列表。

下面是代码: 过程 Tfrm1.FormShow(Sender: TObject); 变量 slPickList:TStringList; 一:整数; 开始 slPickList := TStringList.Create; slPickList.Add('待定'); slPickList.Add('返回'); slPickList.Add('通过'); 对于 I := 0 到 2 做 开始 dbgViewAxiomClaims.Columns1.PickList.add(slPickList[i]);//赋值 结尾; 结束;

结果如下:

【讨论】:

  • 我在你发布这篇文章的 15 个月前给出了这个确切的答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多