Creazione di un elenco a discesa in un DBGrid

Vuoi creare la migliore griglia di modifica dei dati di sempre? Di seguito sono riportate le istruzioni per la creazione di un'interfaccia utente per la modifica dei campi di ricerca All'interno di un DBGrid. In particolare, vedremo come posizionare un DBLookupComboBox in una cella di un DBGrid.

Ciò che farà sarà richiamare le informazioni da un'origine dati che verrà utilizzata per popolare una casella a discesa.

Per mostrare un DBLookupComboBox all'interno di una cella di a DBGrid, devi prima renderne disponibile uno in fase di esecuzione ...

Crea una ricerca con un DBLookupComboBox

Seleziona la pagina "Controlli dati" nella Tavolozza dei componenti e seleziona un DBLookupComboBox. Eliminane uno in qualsiasi punto del modulo e lascia il nome predefinito "DBLookupComboBox1". Non importa dove lo metti dalla maggior parte delle volte, sarà invisibile o fluttuante sulla griglia.

Aggiungi un altro componente DataSource e DataSet per "riempire" la casella combinata con i valori. Rilasciare un TDataSource (con il nome DataSource2) e TAdoQuery (denominarlo AdoQuery1) in qualsiasi punto del modulo.

instagram viewer

Affinché un DBLookupComboBox funzioni correttamente, è necessario impostare diverse altre proprietà; sono la chiave per la connessione di ricerca:

  • Fonte di dati e Campo dati determinare la connessione principale. DataField è un campo in cui vengono inseriti i valori cercati.
  • ListSource è l'origine del set di dati di ricerca.
  • KeyField identifica il campo in ListSource che deve corrispondere al valore di Campo dati campo.
  • ListFields è il / i campo / i del set di dati di ricerca che sono effettivamente visualizzati nella combo. ListField può mostrare più di un campo ma i multipli devono essere separati da punti e virgola.
    Devi impostare un valore abbastanza grande per il dropdownWidth (di un ComboBox) per vedere davvero più colonne di dati.
    Ecco come impostare tutte le proprietà importanti dal codice (nel modulo Evento OnCreate handler):
procedura TForm1.FormCreate (Mittente: TObject);
iniziare con DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // da AdoTable1 - visualizzato in DBGrid
KeyField: = 'Email';
ListFields: = 'Name; E-mail';
Visibile: = Falso;
fine;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'SELEZIONA Nome, Email DA Autori';
AdoQuery1.Open;
fine;

Nota: Quando si desidera visualizzare più di un campo in un DBLookupComboBox, come nell'esempio precedente, è necessario assicurarsi che tutte le colonne siano visibili. Questo viene fatto impostando la proprietà DropDownWidth.

Tuttavia, inizialmente vedrai che devi impostare questo valore su un valore molto grande, il che comporta che l'elenco eliminato sia troppo ampio (nella maggior parte dei casi). Una soluzione alternativa è impostare DisplayWidth di un particolare campo mostrato in a menu `A tendina.

Questo codice, inserito all'interno dell'evento OnCreate per il modulo, assicura che sia il nome dell'autore che la sua e-mail siano visualizzati all'interno dell'elenco a discesa:

AdoQuery1.FieldByName ( 'e-mail') DisplayWidth:. = 10;
AdoQuery1.FieldByName ( 'Nome') DisplayWidth:. = 10;
AdoQuery1.DropDownWidth: = 150;

Ciò che ci resta da fare è effettivamente posizionare una casella combinata sopra una cella (in modalità di modifica), visualizzando il campo AuthorEmail. Innanzitutto, dobbiamo assicurarci che DBLookupComboBox1 sia spostato e dimensionato sulla cella in cui viene visualizzato il campo AuthorEmail.

procedura TForm1.DBGrid1DrawColumnCell
(Mittente: TObject;
const Rect: TRect;
DataCol: intero;
Colonna: TColumn;
Stato: TGridDrawState);
beginif (gdFocused nel Stato) thenbeginif (Colonna. Campo. FieldName = DBLookupComboBox1.DataField) thenwith DBLookupComboBox1 fare
inizio
Sinistra: = Retto. Sinistra + DBGrid1.Left + 2;
In alto: = Retto. Top + DBGrid1.Top + 2;
Larghezza: = Retto. Destra - Rett. Sinistra;
Larghezza: = Retto. Destra - Rett. Sinistra;
Altezza: = Retto. In basso - Rett. Superiore;
Visibile: = True;
fine;
fine
fine;

Quindi, quando lasciamo la cella, dobbiamo nascondere la casella combinata:

procedura TForm1.DBGrid1ColExit (Mittente: TObject);
beginif DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField poi
DBLookupComboBox1.Visible: = False
fine;

Si noti che in modalità di modifica, tutti i tasti vengono indirizzati alla cella di DBGrid ma dobbiamo accertarci che vengano inviati a DBLookupComboBox. Nel caso di un DBLookupComboBox, siamo principalmente interessati al tasto [Tab]; dovrebbe spostare il focus di input sulla cella successiva.

procedura TForm1.DBGrid1KeyPress (Mittente: TObject; Chiave var: Char);
beginif (chiave = Chr (9)) poi Uscita;
Se (DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField) thenbegin
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, word (Key), 0);
fine
fine;

Quando si seleziona un elemento ("riga") da un DBLookupComboBox, il valore o il corrispondente KeyField Il campo è memorizzato come valore di Campo dati campo.

instagram story viewer