Jeg håber, jeg har forstået, hvad du beder om, givet strukturerne af tabellerne vist på dit skærmbillede.
Koden nedenfor viser, hvordan man opsætter en DBLookUPComboBox til at vise en by, der skal vælges for en given person i en persontabel. Jeg har brugt TClientDataSets, så det er selvstændigt abd, så hele opsætningen udføres i kode i stedet for egenskabsindstillinger i Object Inspector.
Det er klart, at DBGrid og dbNavigator er forbundet til dsPerson-datakilden.
Kode
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;
Bemærk, at i stedet for (eller såvel som) at bruge en DBLookUpComboBox, kan du også definere et opslagsfelt i cdsPerson-datasættet ved at tilføje koden nedenfor før opkaldet til cdsPerson.CreateDataSet. Hvis du gør det, vil cdsPerson have en ekstra, Bynavn, kolonne. Dette vil blive vist i DBGrid - du skal muligvis rulle det til højre for at se det - og hvis du klikker i en af CityName-cellerne, vil du se, at det aktiverer en på stedet, rullemenu, hvorfra en by kan blive valgt, sådan
Når du vælger et andet bynavn, opdateres by-id'et i personposten automatisk.
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';
Hvis jeg har forstået din kommentar korrekt, så prøv dette:
-
tilføje en anden DBGrid og DBNavigator og en DBEdit til formularen.
-
sæt alle deres datakilder til dsCity og indstil DBEdit's DataField til Bynavn.
Du kan derefter tilføje en ny by til tabellen By og angive dens CityID (i gitteret) og CityName (i gitteret eller DBEdit). Bemærk, at så snart du gemmer det ved hjælp af den anden DBNavigator, kan du klikke i Bynavn-cellen i Person-gitteret, og det nye Bynavn vil være i rullelisten. Hvis du ønsker at gøre dette, skal du redigere den aktuelle post i Person-tabellen, kan du til det ved at tilføje en AfterPost-hændelseshandler på By-tabellen og tilføje kode til den på denne måde:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;