Jag hoppas att jag har förstått vad du frågar efter, med tanke på strukturerna för tabellerna som visas i din skärmdump.
Koden nedan visar hur man ställer in en DBLookUPComboBox för att visa en stad att välja för en given person i en persontabell. Jag har använt TClientDataSets så att det är fristående abd så att hela inställningen görs i kod snarare än med egenskapsinställningar i Object Inspector.
Uppenbarligen är DBGrid och dbNavigator anslutna till dsPerson-datakällan.
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;
Observera att istället för (eller lika bra som) att använda en DBLookUpComboBox, kan du också definiera ett uppslagsfält i cdsPerson-datauppsättningen, genom att lägga till koden nedan före anropet till cdsPerson.CreateDataSet. Om du gör det kommer cdsPerson att ha en extra, Stadsnamn, kolumn. Detta kommer att visas i DBGrid - du kan behöva rulla det åt höger för att se det - och om du klickar i en av CityName-cellerna ser du att det aktiverar en på plats, rullgardinslista från vilken en stad kan väljas, som så
När du väljer ett annat Stadsnamn uppdateras Stads-ID i personposten automatiskt.
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';
Om jag har förstått din kommentar rätt, prova detta:
-
lägg till en andra DBGrid och DBNavigator och en DBEdit till formuläret.
-
ställ in alla deras datakällor till dsCity och ställ in DBEdits datafält till CityName.
Du kan sedan lägga till en ny stad i tabellen Stad och ange dess Stads-ID (i rutnätet) och Stadsnamn (i rutnätet eller DBEdit). Lägg märke till att så fort du sparar det med den andra DBNavigatorn kan du klicka i cellen Stadsnamn i rutnätet Person och det nya Stadsnamnet kommer att finnas i rullgardinsmenyn. Om du vill göra detta, redigera den aktuella posten i persontabellen, kan du till det genom att lägga till en AfterPost-händelsehanterare i stadstabellen och lägga till kod till den så här:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;