Надеюсь, я понял, о чем вы просите, учитывая структуры таблиц, показанных на вашем скриншоте.
Приведенный ниже код показывает, как настроить 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, вы увидите, что он активирует раскрывающийся список на месте, из которого город может быть выбранным, например,
Когда вы выбираете другое название города, 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;