Doufám, že jsem pochopil, co požadujete, vzhledem ke strukturám tabulek zobrazených na vašem snímku obrazovky.
Níže uvedený kód ukazuje, jak nastavit DBLookUPComboBox k zobrazení města, které chcete vybrat pro danou osobu v tabulce osob. Použil jsem TClientDataSets tak, že je soběstačný a takže celé nastavení se provádí v kódu, nikoli pomocí nastavení vlastností v Inspektoru objektů.
Je zřejmé, že DBGrid a dbNavigator jsou připojeny ke zdroji dat dsPerson.
Kód
TForm1 = class(TForm)
cdsCity: TClientDataSet;
cdsPerson: TClientDataSet;
dsPerson: TDataSource;
DBGrid1: TDBGrid;
DBLookupComboBox1: TDBLookupComboBox;
dsCity: TDataSource;
DBNavigator1: TDBNavigator;
procedure FormCreate(Sender: TObject);
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
var
Field : TField;
begin
Field := TIntegerField.Create(Self);
Field.FieldName := 'CityId';
Field.DataSet := cdsCity;
Field := TStringField.Create(Self);
Field.FieldName := 'City';
Field.Size := 40;
Field.DataSet := cdsCity;
cdsCity.CreateDataSet;
cdsCity.InsertRecord([3, 'Moscow']);
cdsCity.InsertRecord([4, 'Leningrad']);
Field := TIntegerField.Create(Self);
Field.FieldName := 'PersonId';
Field.DataSet := cdsPerson;
Field := TIntegerField.Create(Self);
Field.FieldName := 'CityID';
Field.DataSet := cdsPerson;
Field := TStringField.Create(Self);
Field.FieldName := 'Name';
Field.Size := 40;
Field.DataSet := cdsPerson;
cdsPerson.CreateDataSet;
cdsPerson.InsertRecord([1, 4, 'Ivan']);
cdsPerson.InsertRecord([2, 3, 'Kate']);
DBLookupComboBox1.DataField := 'CityID';
DBLookupComboBox1.DataSource := dsPerson;
DBLookupComboBox1.KeyField := 'CityID';
DBLookupComboBox1.ListField := 'City';
DBLookupComboBox1.ListSource := dsCity;
end;
Všimněte si, že místo (nebo stejně jako) použití DBLookUpComboBox můžete také definovat vyhledávací pole v datové sadě cdsPerson přidáním kódu níže před voláním cdsPerson.CreateDataSet. Pokud tak učiníte, cdsPerson bude mít navíc sloupec CityName. To se zobrazí v DBGrid – možná budete muset posouvat doprava, abyste to viděli – a pokud kliknete do jedné z buněk CityName, uvidíte, že se aktivuje místní rozevírací seznam, ze kterého může město být vybrán, podobně
Když vyberete jiný název města, ID města v záznamu osoby se automaticky aktualizuje.
Field := TStringField.Create(Self);
Field.FieldName := 'CityName';
Field.Size := 40;
Field.DataSet := cdsPerson;
Field.FieldKind := fklookUp;
Field.LookUpDataSet := cdsCity;
Field.LookUpKeyFields := 'CityID';
Field.LookupResultField := 'CityName';
Field.KeyFields := 'CityID';
Pokud jsem správně pochopil váš komentář, zkuste toto:
-
přidejte do formuláře druhý DBGrid a DBNavigator a DBEdit.
-
nastavte všechny jejich datové zdroje na dsCity a nastavte DataField DBEdit na CityName.
Poté můžete přidat nové Město do tabulky Město a zadat jeho CityID (v mřížce) a CityName (v mřížce nebo DBEdit). Všimněte si, že jakmile jej uložíte pomocí druhého DBNavigatoru, můžete kliknout do buňky CityName v mřížce Person a nové CityName bude v rozevíracím seznamu. Pokud jste chtěli provést tuto úpravu aktuálního záznamu z tabulky Osoba, můžete to provést přidáním obsluhy události AfterPost do tabulky Město a přidat do ní kód takto:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;