Création d'une liste déroulante dans un DBGrid

Vous voulez créer la meilleure grille d'édition de données de tous les temps? Vous trouverez ci-dessous des instructions pour créer une interface utilisateur pour la modification des champs de recherche À l'intérieur d'un DBGrid. Plus précisément, nous verrons comment placer un DBLookupComboBox dans une cellule d'un DBGrid.

Cela fera appel à des informations provenant d'une source de données qui seront utilisées pour remplir une zone de liste déroulante.

Pour afficher un DBLookupComboBox à l'intérieur d'une cellule d'un DBGrid, vous devez d'abord en rendre un disponible au moment de l'exécution ...

Créer une recherche avec un DBLookupComboBox

Sélectionnez la page "Contrôles de données" sur la palette de composants et choisissez un DBLookupComboBox. Déposez-en un n'importe où sur le formulaire et laissez le nom par défaut «DBLookupComboBox1». Peu importe où vous le placez, car la plupart du temps, il sera invisible ou flottant sur la grille.

Ajoutez un composant DataSource et DataSet supplémentaire pour "remplir" la zone de liste déroulante avec des valeurs. Déposez un TDataSource (avec le nom DataSource2) et TAdoQuery (nommez-le AdoQuery1) n'importe où sur le formulaire.

instagram viewer

Pour qu'un DBLookupComboBox fonctionne correctement, plusieurs autres propriétés doivent être définies; ils sont la clé de la connexion de recherche:

  • La source de données et Champ de données déterminer la connexion principale. Le DataField est un champ dans lequel nous insérons les valeurs recherchées.
  • ListSource est la source de l'ensemble de données de recherche.
  • KeyField identifie le champ dans le ListSource qui doit correspondre à la valeur du Champ de données champ.
  • ListFields est le ou les champs du jeu de données de recherche qui sont réellement affichés dans le combo. ListField peut afficher plusieurs champs, mais les multiples doivent être séparés par des points-virgules.
    Vous devez définir une valeur suffisamment grande pour DropDownWidth (d'un ComboBox) pour vraiment voir plusieurs colonnes de données.
    Voici comment définir toutes les propriétés importantes du code (dans le formulaire Événement OnCreate gestionnaire):
procédure TForm1.FormCreate (expéditeur: TObject);
commencer avec DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // depuis AdoTable1 - affiché dans le DBGrid
KeyField: = 'Email';
ListFields: = 'Nom; Email';
Visible: = Faux;
fin;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'SELECT Name, Email FROM Authors';
AdoQuery1.Open;
fin;

Remarque: Lorsque vous souhaitez afficher plusieurs champs dans une DBLookupComboBox, comme dans l'exemple ci-dessus, vous devez vous assurer que toutes les colonnes sont visibles. Pour cela, définissez la propriété DropDownWidth.

Cependant, vous verrez qu'au départ, vous devez définir cette valeur sur une valeur très élevée, ce qui entraîne une liste supprimée trop large (dans la plupart des cas). Une solution consiste à définir la largeur d'affichage d'un champ particulier indiqué dans un la liste déroulante.

Ce code, placé dans l'événement OnCreate pour le formulaire, garantit que le nom de l'auteur et son e-mail sont affichés dans la liste déroulante:

AdoQuery1.FieldByName ('Email'). DisplayWidth: = 10;
AdoQuery1.FieldByName ('Name'). DisplayWidth: = 10;
AdoQuery1.DropDownWidth: = 150;

Ce qui nous reste à faire, c'est de faire en réalité une zone de liste déroulante au-dessus d'une cellule (en mode édition), en affichant le champ AuthorEmail. Tout d'abord, nous devons nous assurer que la DBLookupComboBox1 est déplacée et dimensionnée sur la cellule dans laquelle le champ AuthorEmail est affiché.

procédure TForm1.DBGrid1DrawColumnCell
(Expéditeur: TObject;
const Rect: TRect;
DataCol: Entier;
Colonne: TColonne;
État: TGridDrawState);
beginif (gdFocused dans Etat) thenbeginif (Colonne. Champ. FieldName = DBLookupComboBox1.DataField) puis avec DBLookupComboBox1 faire
commencer
Gauche: = Rect. Gauche + DBGrid1.Left + 2;
Haut: = Rect. Haut + DBGrid1.Top + 2;
Largeur: = Rect. Droite - Rect. La gauche;
Largeur: = Rect. Droite - Rect. La gauche;
Hauteur: = Rect. Bas - Rect. Haut;
Visible: = Vrai;
fin;
fin
fin;

Ensuite, lorsque nous quittons la cellule, nous devons masquer la zone de liste déroulante:

procédure TForm1.DBGrid1ColExit (expéditeur: TObject);
beginif DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField ensuite
DBLookupComboBox1.Visible: = False
fin;

Notez qu'en mode édition, toutes les frappes vont dans la cellule de DBGrid mais nous devons nous assurer qu'elles sont envoyées à DBLookupComboBox. Dans le cas d'un DBLookupComboBox, nous nous intéressons principalement à la touche [Tab]; il doit déplacer le focus d'entrée vers la cellule suivante.

procédure TForm1.DBGrid1KeyPress (expéditeur: TObject; var Key: Char);
beginif (clé = Chr (9)) ensuite Sortie;
si (DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField) puis commencer
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, word (Key), 0);
fin
fin;

Lorsque vous choisissez un élément ("ligne") dans une DBLookupComboBox, la valeur ou la valeur correspondante KeyField champ est stocké comme la valeur de la Champ de données champ.

instagram story viewer