Mam nadzieję, że zrozumiałem, o co prosisz, biorąc pod uwagę strukturę tabel pokazanych na zrzucie ekranu.
Poniższy kod pokazuje, jak skonfigurować DBLookUPComboBox do wyświetlania miasta do wybrania dla danej osoby w tabeli osób. Użyłem TClientDataSets, aby był samowystarczalny, a więc całe ustawienie odbywa się w kodzie, a nie przez ustawienia właściwości w Inspektorze obiektów.
Oczywiście DBGrid i dbNavigator są połączone ze źródłem danych dsPerson.
Kod
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;
Zwróć uwagę, że zamiast (lub nawet) używania DBLookUpComboBox, możesz również zdefiniować pole odnośnika w zestawie danych cdsPerson, dodając poniższy kod przed wywołaniem cdsPerson.CreateDataSet. Jeśli to zrobisz, cdsPerson będzie miał dodatkową kolumnę CityName. Zostanie to wyświetlone w DBGrid — może być konieczne przewinięcie go w prawo, aby go zobaczyć — a jeśli klikniesz jedną z komórek CityName, zobaczysz, że aktywuje to listę rozwijaną, z której miasto może być wybrany, tak jak tak
Po wybraniu innej nazwy miasta identyfikator miasta w rekordzie osoby zostanie automatycznie zaktualizowany.
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';
Jeśli dobrze zrozumiałem Twój komentarz, spróbuj tego:
-
dodaj drugi DBGrid i DBNavigator oraz DBEdit do formularza.
-
ustaw wszystkie źródła danych na dsCity i ustaw DataField DBEdit na CityName.
Następnie możesz dodać nowe miasto do tabeli City i określić jego CityID (w siatce) i CityName (w siatce lub DBEdit). Zauważ, że jak tylko zapiszesz go za pomocą drugiego DBNavigator, możesz kliknąć komórkę CityName w siatce Person, a nowa CityName pojawi się na liście rozwijanej. Jeśli chcesz dokonać tej edycji w bieżącym rekordzie tabeli Person, możesz to zrobić, dodając procedurę obsługi zdarzeń AfterPost w tabeli City i dodaj do niej kod w następujący sposób:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;