スクリーンショットに示されているテーブルの構造を考えると、あなたが何を求めているのか理解できたと思います。
以下のコードは、DBLookUPComboBoxを設定して、人物テーブルで特定の人物を選択する都市を表示する方法を示しています。 TClientDataSetsを使用して、自己完結型のabdであるため、設定全体がObject Inspectorのプロパティ設定ではなく、コードで実行されます。
明らかに、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.CreateDataSetを呼び出す前に以下のコードを追加することにより、cdsPersonデータセットにルックアップフィールドを定義することもできます。その場合、cdsPersonには追加のCityName列があります。これはDBGridに表示されます-それを表示するには右にスクロールする必要があるかもしれません-そしてCityNameセルの1つをクリックすると、都市ができるインプレースのドロップダウンリストがアクティブになることがわかりますそのように選択される
別の都市名を選択すると、PersonレコードのCityIDが自動的に更新されます。
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';
あなたのコメントを正しく理解した場合は、これを試してください:
-
2番目のDBGridとDBNavigatorおよびDBEditをフォームに追加します。
-
すべてのデータソースをdsCityに設定し、DBEditのDataFieldをCityNameに設定します。
次に、新しいCityをCityテーブルに追加し、そのCityID(グリッド内)とCityName(グリッドまたはDBEdit内)を指定できます。 2番目のDBNavigatorを使用して保存するとすぐに、PersonグリッドのCityNameセルをクリックすると、新しいCityNameがドロップダウンリストに表示されます。 現在のレコードに対してこの編集を行いたい場合 Personテーブルの場合、CityテーブルにAfterPostイベントハンドラーを追加し、次のようにコードを追加することで、次のようにできます。
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;