Ich hoffe, ich habe verstanden, wonach Sie fragen, angesichts der Strukturen der Tabellen, die in Ihrem Screenshot gezeigt werden.
Der folgende Code zeigt, wie eine DBLookUPComboBox eingerichtet wird, um eine Stadt anzuzeigen, die für eine bestimmte Person in einer Personentabelle ausgewählt werden soll. Ich habe TClientDataSets so verwendet, dass es in sich geschlossen ist und dass die gesamte Einrichtung im Code statt durch Eigenschaftseinstellungen im Objektinspektor erfolgt.
Offensichtlich sind DBGrid und dbNavigator mit der dsPerson-Datenquelle verbunden.
Code
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;
Beachten Sie, dass Sie anstelle (oder zusätzlich zu) einer DBLookUpComboBox auch ein Nachschlagefeld in der cdsPerson-Datenmenge definieren können, indem Sie den folgenden Code vor dem Aufruf von cdsPerson.CreateDataSet hinzufügen. Wenn Sie dies tun, wird cdsPerson eine zusätzliche Spalte CityName haben. Dies wird im DBGrid angezeigt – Sie müssen es möglicherweise nach rechts scrollen, um es zu sehen – und wenn Sie in eine der CityName-Zellen klicken, sehen Sie, dass es eine integrierte Dropdown-Liste aktiviert, aus der eine Stadt ausgewählt werden kann ausgewählt werden, so
Wenn Sie einen anderen Städtenamen auswählen, wird die CityID im Personendatensatz automatisch aktualisiert.
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';
Wenn ich Ihren Kommentar richtig verstanden habe, versuchen Sie Folgendes:
-
Fügen Sie dem Formular ein zweites DBGrid und einen zweiten DBNavigator sowie ein DBEdit hinzu.
-
Setzen Sie alle ihre Datenquellen auf dsCity und setzen Sie das DataField von DBEdit auf CityName.
Sie können dann der City-Tabelle eine neue Stadt hinzufügen und ihre CityID (im Raster) und CityName (im Raster oder in DBEdit) angeben. Beachten Sie, dass Sie, sobald Sie es mit dem zweiten DBNavigator speichern, in die CityName-Zelle des Personenrasters klicken können und der neue CityName in der Dropdown-Liste angezeigt wird. Wenn Sie diese Bearbeitung am aktuellen Datensatz vornehmen möchten der Person-Tabelle könnten Sie dazu einen AfterPost-Event-Handler in der City-Tabelle hinzufügen und diesen Code wie folgt hinzufügen:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;