1

2列のテーブルがあります。ConfigItem と ConfigValue。ここで、ConfigValue が dbcombobox である必要がある dbgrid にこれを入力します。

ConfigItem のサンプル (最初の列)

製品

製品タイプ

アイテムの種類

アイテム

ConfigValue には dbcombobox が必要であり、コンボボックスの項目は最初の列の値に基づいて設定される必要があります。

例。ユーザーが構成アイテムとして製品を含む最初の行をクリックすると、グリッドの同じ行の ConfigValue 列に、製品のリストを含むコンボボックスが含まれている必要があります。

グリッドの BeforeDrawCell イベントを使用できる可能性がありますが、adoquery またはデータセット コンポーネントを使用してこれを処理できる方法を見つけようとしています。

誰かがこの問題の解決策を教えてください。

前もって感謝します、Divyesh

4

1 に答える 1

1

AfterScrollEvent を使用して PickList を列に割り当てることができます。
Picklist は、マスター StringList のオブジェクトに割り当てられた Stringlist です。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.
于 2013-05-17T14:31:39.257 に答える