J'espère avoir compris ce que vous demandez, étant donné les structures des tables présentées dans votre capture d'écran.
Le code ci-dessous montre comment configurer un DBLookUPComboBox pour afficher une ville à sélectionner pour une personne donnée dans une table de personnes. J'ai utilisé TClientDataSets pour qu'il soit autonome et que toute la configuration soit effectuée dans le code plutôt que par les paramètres de propriété dans l'inspecteur d'objets.
De toute évidence, DBGrid et dbNavigator sont connectés à la source de données dsPerson.
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;
Notez qu'au lieu (ou en plus) d'utiliser un DBLookUpComboBox, vous pouvez également définir un champ de recherche dans l'ensemble de données cdsPerson, en ajoutant le code ci-dessous avant l'appel à cdsPerson.CreateDataSet. Si vous le faites, le cdsPerson aura une colonne supplémentaire, CityName. Cela s'affichera dans le DBGrid - vous devrez peut-être le faire défiler vers la droite pour le voir - et si vous cliquez dans l'une des cellules CityName, vous verrez qu'il active une liste déroulante sur place à partir de laquelle une ville peut être sélectionné, comme ça
Lorsque vous sélectionnez un nom de ville différent, le CityID dans l'enregistrement de la personne est automatiquement mis à jour.
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';
Si j'ai bien compris votre commentaire, essayez ceci :
-
ajoutez un deuxième DBGrid et DBNavigator et un DBEdit au formulaire.
-
définissez toutes leurs sources de données sur dsCity et définissez le DataField de DBEdit sur CityName.
Vous pouvez ensuite ajouter une nouvelle ville à la table City et spécifier son CityID (dans la grille) et CityName (dans la grille ou DBEdit). Notez que dès que vous l'enregistrez à l'aide du deuxième DBNavigator, vous pouvez alors cliquer dans la cellule CityName de la grille Person et le nouveau CityName sera dans la liste déroulante. Si vous vouliez apporter cette modification à l'enregistrement actuel de la table Person, vous pouvez le faire en ajoutant un gestionnaire d'événements AfterPost sur la table City et en y ajoutant du code comme ceci :
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;