Erstellen einer Dropdown-Liste in einem DBGrid

Möchten Sie das beste Datenbearbeitungsraster aller Zeiten erstellen? Im Folgenden finden Sie Anweisungen zum Erstellen einer Benutzeroberfläche zum Bearbeiten von Suchfeldern in einem DBGrid. Insbesondere wird untersucht, wie eine DBLookupComboBox in eine Zelle eines DBGrid platziert wird.

Auf diese Weise werden Informationen aus einer Datenquelle abgerufen, die zum Auffüllen eines Dropdown-Felds verwendet werden.

Um eine DBLookupComboBox in einer Zelle eines DBGrid anzuzeigen, müssen Sie zunächst eine DBLookupComboBox zur Laufzeit verfügbar machen.

Erstellen Sie eine Suche mit einer DBLookupComboBox

Wählen Sie die Seite "Datensteuerelemente" in der Komponentenpalette aus und wählen Sie eine DBLookupComboBox aus. Legen Sie eine beliebige Stelle im Formular ab und belassen Sie den Standardnamen "DBLookupComboBox1". Es spielt keine Rolle, wo Sie es ablegen, da es die meiste Zeit unsichtbar ist oder über dem Gitter schwebt.

Fügen Sie eine weitere DataSource- und DataSet-Komponente hinzu, um das Kombinationsfeld mit Werten zu "füllen". Legen Sie eine TDataSource (mit dem Namen DataSource2) und TAdoQuery (mit dem Namen AdoQuery1) an einer beliebigen Stelle im Formular ab.

Damit eine DBLookupComboBox ordnungsgemäß funktioniert, müssen mehrere weitere Eigenschaften festgelegt werden. Sie sind der Schlüssel zur Lookup-Verbindung:

  • Datenquelle und Datenfeld Hauptverbindung ermitteln. Das DataField ist ein Feld, in das wir die nachgeschlagenen Werte einfügen.
  • ListSource ist die Quelle des Suchdatensatzes.
  • KeyField kennzeichnet das Feld im ListSource das muss mit dem Wert des übereinstimmen Datenfeld Feld.
  • ListFields ist das / die Feld (er) des Suchdatensatzes, die tatsächlich in der Kombination angezeigt werden. ListField kann mehr als ein Feld anzeigen, aber mehrere Felder sollten durch Semikolons getrennt werden.
    Sie müssen einen Wert einstellen, der groß genug ist für DropDownWidth (einer ComboBox), um wirklich mehrere Datenspalten zu sehen.
    So legen Sie alle wichtigen Eigenschaften im Code fest (im OnCreate-Ereignishandler des Formulars):
Verfahren TForm1.FormCreate (Absender: TObject);
anfangen mit DBLookupComboBox1 Dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // from AdoTable1 - wird im DBGrid angezeigt
KeyField: = 'Email';
ListFields: = 'Name; Email';
Sichtbar: = Falsch;
Ende;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'SELECT Name, Email FROM Authors';
AdoQuery1.Open;
Ende;

Hinweis: Wenn Sie mehr als ein Feld in einer DBLookupComboBox anzeigen möchten, wie im obigen Beispiel, müssen Sie sicherstellen, dass alle Spalten sichtbar sind. Dies erfolgt durch Festlegen der DropDownWidth-Eigenschaft.

Sie werden jedoch feststellen, dass Sie anfangs einen sehr großen Wert festlegen müssen, was dazu führt, dass die Dropdown-Liste (in den meisten Fällen) zu breit ist. Eine Problemumgehung besteht darin, die Anzeigebreite eines bestimmten Felds festzulegen, das in einer Dropdown-Liste angezeigt wird.

Dieser Code, der in das OnCreate-Ereignis für das Formular eingefügt wird, stellt sicher, dass sowohl der Autorenname als auch die E-Mail-Adresse in der Dropdown-Liste angezeigt werden:

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

Wir müssen lediglich ein Kombinationsfeld über eine Zelle bewegen (im Bearbeitungsmodus) und das AuthorEmail-Feld anzeigen. Zuerst müssen wir sicherstellen, dass die DBLookupComboBox1 über die Zelle verschoben und in der Größe angepasst wird, in der das AuthorEmail-Feld angezeigt wird.

Verfahren TForm1.DBGrid1DrawColumnCell
(Absender: TObject;
const Rect: TRect;
DataCol: Integer;
Spalte: TColumn;
Zustand: TGridDrawState);
beginif (gdFocused im Zustand) thenbeginif (Column.Field.FieldName = DBLookupComboBox1.DataField) dann mit DBLookupComboBox1 tun
Start
Links: = Rect.Left + DBGrid1.Left + 2;
Oben: = Rect.Top + DBGrid1.Top + 2;
Width: = Rect.Right - Rect.Left;
Width: = Rect.Right - Rect.Left;
Höhe: = Rect.Bottom - Rect.Top;
Sichtbar: = Wahr;
Ende;
Ende
Ende;

Wenn wir die Zelle verlassen, müssen wir das Kombinationsfeld ausblenden:

Verfahren TForm1.DBGrid1ColExit (Absender: TObject);
beginif DBGrid1.SelectedField.FieldName = DBLookupComboBox1.DataField dann
DBLookupComboBox1.Visible: = False
Ende;