【问题标题】:Delphi DBGrid conditional dbcomboDelphi DBGrid 条件 dbcombo
【发布时间】:2013-05-17 13:18:11
【问题描述】:

我有一个有两列的表。配置项和配置值。现在我想将它填充到一个 dbgrid 中,其中 ConfigValue 应该是一个 dbcombobox。

示例配置项(第一列)

产品

产品类型

物品类型

物品

ConfigValue 应该有一个 dbcombobox,并且应该根据第一列中的值填充组合框的项目。

示例。 如果用户单击具有 Product 作为配置项的第一行,则网格中同一行的 ConfigValue 列应包含带有产品列表的组合框。

可能我可以使用网格的 BeforeDrawCell 事件,但是我正在尝试找到一种可以使用 adoquery 或数据集组件来处理它的方法。

有人可以指导解决这个问题的方法吗。

提前致谢, 迪维什

【问题讨论】:

    标签: delphi tdbgrid


    【解决方案1】:

    您可以使用 AfterScrollEvent 将 PickList 分配给您的列。
    Picklist 是分配给主 StringList 对象的 Stringlists。 根据您的 Delphi 版本,您可以使用通用字典。

    unit Unit2;
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, Grids, DBGrids, ADODB;
    
    type
      TForm2 = class(TForm)
        ADODataSet1: TADODataSet;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        procedure FormCreate(Sender: TObject);
        procedure ADODataSet1AfterScroll(DataSet: TDataSet);
      private
        { Private-Deklarationen }
        FList: TStringList;
      public
        { Public-Deklarationen }
      end;
    
    var
      Form2: TForm2;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm2.ADODataSet1AfterScroll(DataSet: TDataSet);
    var
      idx: Integer;
    begin
      if Assigned(FList) and (DBGrid1.Columns.Count > 1) then
      begin
        DBGrid1.Columns[1].ButtonStyle := cbsAuto;
        idx := FList.IndexOf(DBGrid1.Columns[0].Field.asString);
        if idx > -1 then
          DBGrid1.Columns[1].PickList := TStringList(FList.Objects[idx])
        else
          DBGrid1.Columns[1].PickList := nil;
      end;
    end;
    
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i: Integer;
    begin  // some demo filling
      FList := TStringList.Create;
      FList.AddObject('A1A1', TStringList.Create);
      for i := 0 to 10 do
        TStringList(FList.Objects[FList.Count - 1]).Add(Format('group1_%d', [i]));
      FList.AddObject('A1A2', TStringList.Create);
      for i := 0 to 10 do
        TStringList(FList.Objects[FList.Count - 1]).Add(Format('group2_%d', [i]));
    end;
    
    procedure TForm2.FormDestroy(Sender: TObject);
    var
      i: Integer;
    begin
      for I := 0 to FList.Count - 1 do Flist.Objects[i].Free;
      FList.Free;
    end;
    
    end.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多