Надеюсь, я понял, о чем вы просите, учитывая структуры таблиц, показанных на вашем скриншоте.
Приведенный ниже код показывает, как настроить DBLookUPComboBox для отображения города, выбранного для данного региона. человек в личном столе. Я использовал TClientDataSets так, чтобы он был автономным abd, чтобы вся настройка выполнялась в коде, а не с помощью настроек свойств в Инспекторе объектов.
Очевидно, что DBGrid и dbNavigator подключены к dsPerson источник данных.
Код
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;
Обратите внимание, что вместо (или также) с использованием DBLookUpComboBox вы также можете определить поле поиска в наборе данных cdsPerson, добавив приведенный ниже код перед вызов cdsPerson.CreateDataSet. Если вы это сделаете, у cdsPerson будет дополнительный столбец CityName. Это отобразится в DBGrid - вам может понадобиться прокрутить его вправо, чтобы увидеть его - и если вы щелкнете по одной из ячеек CityName, вы увидите, что он активирует раскрывающийся список на месте, из которого город может быть выбранным, например,
![Screenshot of grid with in-place CityName selector](https://i.stack.imgur.com/Fx3BT.png)
Когда вы выбираете другое название города, CityID в записи Person автоматически обновляется.
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';
Если я правильно понял ваш комментарий, попробуйте следующее:
Затем можно добавить новый город в таблицу City и указать его CityID (в сетке) и CityName ( в сетке или DBEdit). Обратите внимание, что как только вы сохраните его с помощью второго DBNavigator, вы можете щелкнуть ячейку CityName сетки Person, и новое CityName появится в раскрывающемся списке. Если вы хотите сделать это изменение для текущей записи таблицы Person, вы можете сделать это, добавив обработчик события AfterPost в таблицу City и добавив в него код, подобный этому:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;