Creazione di un elenco a discesa in un controllo DBGrid

Vuoi creare la migliore griglia per la 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, esamineremo come inserire un DBLookupComboBox in una cella di un DBGrid.

Ciò che farà è 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 un DBGrid, devi prima renderne uno disponibile in fase di esecuzione ...

Crea una ricerca con un DBLookupComboBox

Selezionare la pagina "Controlli dati" nella tavolozza dei componenti e selezionare un DBLookupComboBox. Eliminarne uno ovunque nel modulo e lasciare il nome predefinito di "DBLookupComboBox1". Non importa dove lo metti poiché la maggior parte delle volte, sarà invisibile o fluttuerà sulla griglia.

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

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

  • DataSource e DataField determinano la connessione principale. Il DataField è un campo in cui inseriamo i valori cercati.
  • ListSource è l'origine del set di dati di ricerca.
  • KeyField identifica il campo in ListSource che deve corrispondere al valore del campo DataField.
  • ListFields è il campo (i) del set di dati di ricerca che vengono effettivamente visualizzati nella combinazione. ListField può mostrare più di un campo ma i multipli devono essere separati da punto e virgola.
    Devi impostare un valore abbastanza grande per DropDownWidth (di un ComboBox) per vedere davvero più colonne di dati.
    Ecco come impostare tutte le proprietà importanti dal codice (nel gestore di eventi OnCreate del modulo):
procedura TForm1.FormCreate (Sender: TObject);
iniziare con DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // from AdoTable1 - visualizzato nel DBGrid
KeyField: = "Email";
ListFields: = 'Name; E-mail';

Visibile: = False;
fine;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'SELEZIONA nome, email da autori';
AdoQuery1.Open;
fine;

Nota: Quando vuoi visualizzare più di un campo in un DBLookupComboBox, come nell'esempio sopra, devi assicurarti che tutte le colonne siano visibili. Questa operazione viene eseguita impostando la proprietà DropDownWidth.

Tuttavia, vedrai che inizialmente devi impostarlo su un valore molto grande che si traduce in un elenco rilasciato troppo ampio (nella maggior parte dei casi). Una soluzione alternativa consiste nell'impostare il DisplayWidth di un particolare campo mostrato in un elenco a discesa.

Questo codice, inserito all'interno dell'evento OnCreate per il modulo, garantisce che sia il nome dell'autore che la sua email vengano visualizzati nell'elenco a discesa:

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

Quello che ci resta da fare è far passare una casella combinata su una cella (quando in modalità di modifica), visualizzando il campo AuthorEmail. Innanzitutto, dobbiamo assicurarci che DBLookupComboBox1 sia spostato e ridimensionato sulla cella in cui viene visualizzato il campo AuthorEmail.

procedura TForm1.DBGrid1DrawColumnCell
(Mittente: TObject;
const Rect: TRect;
DataCol: Integer;
Colonna: TColumn;
Stato: TGridDrawState);
beginif (gdFocused in Stato) thenbeginif (Column.Field.FieldName = DBLookupComboBox1.DataField) quindi con DBLookupComboBox1 do
iniziare
A sinistra: = Rect.Left + DBGrid1.Left + 2;
Top: = Rect.Top + DBGrid1.Top + 2;
Larghezza: = Rect.Right - Rect.Left;
Larghezza: = Rect.Right - Rect.Left;
Altezza: = Rect.Bottom - Rect.Top;
Visibile: = True;
fine;
fine
fine;

Successivamente, quando usciamo dalla cella, dobbiamo nascondere la casella combinata:

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

Notare che in modalità di modifica, tutte le sequenze di tasti vanno alla cella di DBGrid ma dobbiamo assicurarci che vengano inviate a DBLookupComboBox. Nel caso di un DBLookupComboBox, siamo principalmente interessati al tasto [Tab]; dovrebbe spostare il focus di input alla cella successiva.

procedura TForm1.DBGrid1KeyPress (Sender: TObject; var Key: Char);
beginif (chiave = Chr (9)) poi Exit;
if (DBGrid1.SelectedField.FieldName = DBLookupComboBox1.DataField) quindi iniziare
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 campo KeyField corrispondente viene archiviato come valore del campo DataField.