Ik hoop dat ik heb begrepen waar je om vraagt, gezien de structuren van de tabellen in je screenshot.
De onderstaande code laat zien hoe u een DBLookUPComboBox instelt om een stad weer te geven die voor een bepaalde persoon in een personentabel moet worden geselecteerd. Ik heb TClientDataSets zo gebruikt dat het op zichzelf staat, zodat de hele instelling in code wordt gedaan in plaats van door eigenschapsinstellingen in de Object Inspector.
Uiteraard zijn de DBGrid en dbNavigator verbonden met de dsPerson databron.
Code
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;
Merk op dat u in plaats van (of naast) een DBLookUpComboBox te gebruiken, ook een opzoekveld in de cdsPerson-dataset zou kunnen definiëren, door de onderstaande code toe te voegen vóór de aanroep van cdsPerson.CreateDataSet. Als u dat doet, heeft de cdsPerson een extra kolom Stadsnaam. Dit wordt weergegeven in de DBGrid - u moet mogelijk naar rechts scrollen om het te zien - en als u in een van de cellen CityName klikt, ziet u dat het een in-place vervolgkeuzelijst activeert waaruit een stad kan worden geselecteerd, zoals zo
Wanneer u een andere Stadsnaam selecteert, wordt de Stads-ID in het Persoonsrecord automatisch bijgewerkt.
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';
Als ik je opmerking goed heb begrepen, probeer dan dit:
-
voeg een tweede DBGrid en DBNavigator en een DBEdit toe aan het formulier.
-
stel al hun databronnen in op dsCity en stel het DataField van DBEdit in op CityName.
U kunt dan een nieuwe stad aan de tabel Stad toevoegen en de Stads-ID (in het raster) en Stadsnaam (in het raster of DBEdit) specificeren. Merk op dat zodra u het opslaat met de tweede DBNavigator, u vervolgens in de cel Stadsnaam van het Persoonsraster kunt klikken en dat de nieuwe Stadsnaam in de vervolgkeuzelijst zal staan. Als u deze bewerking wilt uitvoeren op het huidige record van de Person-tabel, kunt u daaraan toevoegen door een AfterPost-gebeurtenishandler toe te voegen aan de City-tabel en er als volgt code aan toe te voegen:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;