2013-05-17 4 views
1

У меня есть таблица с двумя столбцами. ConfigItem и ConfigValue. Теперь я хочу заполнить это в dbgrid, где ConfigValue должен быть dbcombobox.Delphi DBGrid условный dbcombo

Образец ConfigItem (первая колонка)

Продукт

Тип продукта

Тип элемента

товары

ConfigValue должны иметь dbcombobox и пункты выпадающего списка должны быть заселены на основе значений в первом столбце.

Пример. Если пользователь нажимает на первую строку, у которой есть Продукт как элемент конфигурации, то для той же строки в столбце ConfigValue в сетке должен содержаться список со списком продуктов.

Возможно, я могу использовать событие BeforeDrawCell для сетки, однако я пытаюсь найти способ, с помощью которого это можно обрабатывать с использованием компонента adoquery или набора данных.

Может ли кто-нибудь обратиться за помощью к решению проблемы этой проблемы.

Спасибо заранее, Divyesh

ответ

1

Вы можете использовать AfterScrollEvent назначить PickList вашего колонка.
Пиксель здесь Строки, назначенные объекту мастера 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. 
Смежные вопросы