Wie schnell füllen einer combobox mit Daten aus Datenbanken (VCL)
Habe ich gelesen, die alle Arten von Dokumenten über das web, was ein farly gemeinsame und schmerzlose Durchführung. Da habe ich keine konsistente und glatt-Antwort (sogar der Embarcadero-website beschreibt einige Eigenschaften falsch!) Ich werde zu die post ein "kurzes" howto.
Typischen, häufigen Anwendungsfall: die Entwickler nur will painlessy zeigen ein paar der Datenbank extrahierten Informationen in einer combo-box (also eine Auswahl der Sprache), erhalten Sie die Wahl des Benutzers aus, und das ist es.
Anforderungen:
- Delphi, mehr oder weniger jeder version. VCL ist bedeckt.
- Einer Datenbank-Tabelle. Nehmen wir eine einfache Tabelle mit einer
id
undvalue
Felder. - Ein DataSet (einschließlich Abfragen und ClientDataSets).
- Einer DataSource verknüpft mit der DataSet.
- Eine TDBLookupComboBox verknüpft mit der Datenquelle, wird eine Liste von Werten und "zurück" die aktuell gewählte id.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens entscheiden wir, ob die Sortierreihenfolge ist der, den wir wollen oder nicht, und wenn alle Elemente in einer Tabelle dargestellt werden müssen. In den meisten Fällen eine einfache
ORDER BY
Klausel oder ein DataSet-index wird genug sein. Im Fall ist es nicht, wir können hinzufügen, einsort_order
Feld und füllen Sie es mit Ganzzahlen, die unsere benutzerdefinierte Sortierreihenfolge. Sie im Falle wollen wir zeigen nur einige Elemente, die wir hinzufügenvisible
oderenabled
Feld, und verwenden Sie es in unser SQL. Beispiel:Ich habe
visible
als INTEGER und überprüfen Sie es gegen1
und nichtTRUE
weil viele Datenbanken (einschließlich der am meisten verwendeten SQLite) haben wenig Unterstützung für Boolesche Werte.Dann eine optionale, aber erstaunlich oft nette Idee: vorübergehend fügen Sie ein TDBGrid auf die form, verknüpfen Sie es mit der gleichen TDataSource der TLookupComboBox und überprüfen, dass Sie tatsächlich sehen, die gewünschten Daten füllen. In der Tat ist es einfach zu typo etwas in einer Abfrage (vorausgesetzt, Sie verwenden eine SQL-DataSet) und bekommen keine Daten, und dann werden Sie sich Fragen, warum die TDBLookupComboBox nicht füllen.
Einmal gesehen, werden die Daten korrekt angezeigt, entfernen Sie das Gitter.
Eine weitere sinnvolle Idee ist es mit ClientDataSets für diese Arten von Implementierungen: aufgrund von, wie Sie arbeiten, Sie wird "cache", die wenige Zeilen enthalten, die in Ihrem look-ups bei Programm-Start und dann keine weiteren Datenbank-Zugriff (und die Verlangsamung und Verkehr) erforderlich werden.
Öffnen Sie nun die TDBLookupComboBox Eigenschaften und füllen Sie nur die folgenden:
ListSource
(und nichtDataSource
): legen Sie es auf die TDataSource verbunden mit dem DataSet ein, das Sie anzeigen möchten Werte.ListField
: Sie können den Feldnamen, den Sie möchten, dass der Benutzer zu sehen. In unserem demo-Fall, es wäre dievalue
Feld.KeyField
: legen Sie es auf das Feld name, dessen Wert Sie möchten, dass das Programm Sie wieder. In unserem demo-es wäre dieid
Feld.Vergessen Sie nicht, überprüfen Sie die TabOrder-Eigenschaft, es gibt immer noch Menschen, die Liebe, die Navigation durch die Steuerelemente durch drücken der
TAB
Schlüssel und nichts ist ärgerlicher als zu sehen, die Auswahl hüpfen zufällig, wie deine ComboBox gesetzt wurde, zuletzt auf die form trotz der grafischen Darstellung der Sekunde!Wenn alles, was Sie brauchen, ist in einem Formular anzeigen und Lesen Sie die TDBLookupComboBox ausgewählten Wert, wenn der Benutzer eine Taste drückt, sind Sie ziemlich viel sortiert.
Alles, was Sie haben zu tun, die in der Schaltfläche OnClick-event-handler Lesen Sie die combo-box-Wert mit diesem code:
Wo
SelectedId
ist eine variable wo Sie speichern den zurückgegebenen Wert und dieMyCombo
natürlich ist der name der TDBLookupComboBox. Beachten Sie, wie KeyValue enthält nicht den text, den der Benutzer sieht auf dem Bildschirm aber der Wert derid
Feld, das wir angegeben inKeyField
. Also, wenn unsere user ausgewählt-Datenbank Zeile war:MyCombo.KeyValue enthält
5
.Aber was, wenn Sie brauchen, um dynamisch zu aktualisieren, die Sachen auf dem Formular, je nachdem, un die combo-box-Auswahl des Benutzers? Es gibt keine
OnChange
Ereignis für unsere TDBLookupComboBox! Deshalb, wenn Sie brauchen, um dynamische Updates von Sachen, um basierend auf dem im Kombinationsfeld Auswahl, die Sie anscheinend nicht können. Sie können versuchen, die verschiedenen "OnExit" etc. Ereignisse, aber alle von Ihnen haben schwerwiegende Nachteile oder Nebenwirkungen.Eine mögliche Lösung ist, erstellen Sie eine neue Komponente Erben von TDBLookupComboBox, deren einzige Aufgabe ist, öffentlich zu machen die versteckten OnChange-Ereignis. Aber das ist overkill, nicht wahr?
Gibt es eine andere Möglichkeit: gehen Sie auf die DataSet Ihre TDBLookupComboBox gebunden ist (durch eine DataSource). Öffnen Sie Ihre Ereignisse und doppelklicken Sie auf das
OnAfterScroll
Veranstaltung.Dort können Sie simulieren ein OnChange-Ereignis ziemlich gut.
Zum Wohle der demonstration, fügen Sie eine integer-variable und ein TEdit-Feld auf das Formular, und rufen Sie:
SelectedId
undEditValue
.Ist es: Sie können ersetzen die beiden demo-Linien mit Ihren eigenen Verfahren fordert, und was man sonst noch braucht, um dynamisch zu aktualisieren, die Ihre form auf der Grundlage des Benutzers Entscheidungen in Ihrem combo-box.
Eine kleine Warnung: die Verwendung des DataSet -
OnAfterScroll
hat einen Nachteil: das Ereignis wird aufgerufen, öfter als du denkst. Im Beispiel, es kann aufgerufen werden, wenn der Datensatz geöffnet wird, aber auch mehr als einmal aufgerufen werden während der Aufzeichnungen der navigation. Daher muss Ihr code befassen sich mit wird häufiger aufgerufen als nötig.In diesem Fall reiben Sie Ihre Hände und denken, Ihr job ist getan!
Gar nicht! Erstellen Sie einfach ein kurzes demo-Anwendung die Umsetzung aller oben genannten und du wirst feststellen es fehlt ein wichtiger finishing touch: wenn es beginnt, das Kombinationsfeld hat eine lästige "leere" Standard-Wahl. Das heißt, auch wenn Ihre Datenbank hält sagen wir 4 Möglichkeiten, das Formular mit einem leeren Kombinationsfeld ausgewählten Wert auf den ersten.
Wie machen Sie Ihre Auswahl erscheint automatisch eine "pre-selected" in der combo-box, wie Sie und Ihre Benutzer erwarten?
Einfach!
Nur einen Wert zuweisen, die KeyValue Eigenschaft, die wir bereits oben beschrieben.
Das heißt, auf der
OnFormCreate
oder andere passende event, nur hard-code-eine Auswahl wie im Beispiel:Zum Beispiel, indem Sie die Beispiel-Datenbank Zeile oben geschrieben, würde man schreiben:
... und die combo-box wird angezeigt: "MyText" als vorausgewählte option, wenn der Benutzer öffnet seine form.
Natürlich können Sie es vorziehen, mehr elegant und beteiligt Möglichkeiten, um ein Standard-Schlüssel als hart codierte seinen Standardwert. Im Beispiel möchten Sie vielleicht, um zu zeigen, das erste alphabetisch geordnete, textuelle Beschreibung, die in Ihrer Datenbank-Tabelle oder was auch immer andere Kriterium. Aber die grundlegende mechanik ist der oben gezeigte: erhalten Sie das Schlüssel /id-Wert in irgendeiner Art und Weise Sie wollen, und dann ordnen Sie die
KeyValue
Eigenschaft.Danken Ihr für das Lesen dieses HowTo bis zum Ende!