Home > Artikel > Ausgabe 9/2013 > TreeView und Unterformulare

TreeView und Unterformulare

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Ein TreeView-Steuerelement kann zwar hierarchische Daten anzeigen, aber es ist nicht dazu geeignet, mehr als einige wenige Informationen zum jeweiligen Element zu liefern. Wenn Sie weitere Informationen zum jeweils markierten Element einblenden möchten, werden Sie dies entweder im gleichen Formular erledigen, in dem sich das TreeView-Steuerelement befindet oder in einem Unterformular-Steuerelement, das gegebenenfalls verschiedene Unterformulare anzeigen kann.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1309_TreeView.mdb.

Beispielobjekte

In dieser Datenbank finden Sie ein Formular namens frmKundenBestellungenArtikel vor, das bereits im Artikel Das TreeView-Steuerelement: Verknüpfte Daten, Teil I beschrieben wurde und als Grundlage für das in diesem Artikel erstellte Formular frmKundenBestellungenArtikel_Unterformular dient.

Vom TreeView zum Unterformular

Wenn wir beispielsweise das TreeView-Steuerelement aus dem Artikel Das TreeView-Steuerelement: Verknüpfte Daten, Teil I betrachten, finden wir zwar bereits eine Menge Informationen vor (siehe Bild 1).

Beispiel für hierarchische Daten

Bild 1: Beispiel für hierarchische Daten

Es zeigt eine Übersicht aller Kunden an und liefert per Mausklick die Datumsangaben zu den bisherigen Bestellungen sowie die bestellten Artikel. Nun wäre es doch richtig praktisch, wenn das Formular, in dem sich das TreeView-Steuerelement befindet, weitere Informationen zum jeweils angeklickten Element anzeigen würde. Wenn der Benutzer auf einen Kunden klickt, soll das Formular beispielsweise die Details zu diesem Kunden liefern, wenn er eine Bestellung anklickt, soll die Bestellung erscheinen – mit Bestelldatum und gegebenenfalls mit Bestellpositionen. Wenn der Benutzer dann auf eine der Bestellpositionen im TreeView klickt, kann das Formular gleich den passenden Artikel samt Details anzeigen – die Bestellpositionen erscheinen ja bereits, wenn der Benutzer auf die Bestellung klickt.

Wie organisieren wir dies? Am einfachsten ist es, verschiedene Unterformular anzulegen, die bei Bedarf in einem Unterformular-Steuerelement eingeblendet werden und den passenden Datensatz anzeigen.

Wir benötigen also drei Unterformulare:

  • eines für die Kunden,
  • eines für die Bestellung samt Bestelldetails und
  • eines für die Artikel.

Unterformulare

Wir werden diese Unterformular recht einfach halten, um den eigentlichen Fokus dieses Artikels nicht aus den Augen zu lassen. Daher in aller Kürze:

Das Unterformular sfmKunden soll die Daten der Tabelle tblKunden anzeigen.

Daher stellen Sie die Eigenschaft Datenherkunft auf diese Tabelle ein und fügen dem Formularentwurf die benötigten Felder der Tabelle hinzu (siehe Bild 2).

Das Unterformular sfmKunden in der Entwurfsansicht

Bild 2: Das Unterformular sfmKunden in der Entwurfsansicht

Das Unterformular sfmArtikel wird über die Eigenschaft Datenherkunft an die Tabelle tblArtikel gebunden. Ziehen Sie alle Felder der Tabelle Artikel in den Detailbereich des Formularentwurfs und ordnen Sie diese grob an (siehe Bild 3).

Unterformular zur Anzeige der Artikeldetails

Bild 3: Unterformular zur Anzeige der Artikeldetails

Das Unterformular sfmBestellungenzeigt im oberen Bereich die Daten der Bestellung selbst an, also Bestelldatum et cetera. Entsprechend stellen Sie als Datenherkunft die Tabelle tblBestellungen ein und fügen die gewünschten Felder zum Entwurf hinzu.

Es soll jedoch noch ein weiteres Unterformular enthalten, das die Bestellpositionen enthält. Dieses verwendet die Tabelle tblBestellpositionen als Datenherkunft. Stellen Sie dort außerdem die Eigenschaft Standardansicht auf Datenblatt ein (siehe Bild 4).

Das Unterformular sfmBestelldetails soll in der Datenblattansicht erscheinen.

Bild 4: Das Unterformular sfmBestelldetails soll in der Datenblattansicht erscheinen.

Wenn Sie das Unterformular sfmBestellpositionen in das übergeordnete Unterformular sfmBestellungen ziehen, sollten die beiden Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformularsteuerelements automatisch jeweils auf das Feld BestellungID eingestellt werden.

Falls nicht, holen Sie dies manuell nach. Dazu markieren Sie das Unterformular-Steuerelement, nicht das Unterformular selbst – dies geht am einfachsten durch Auswählen des entsprechenden Eintrags in der Liste im Eigenschaftsfenster (siehe Bild 5).

Verknüpfung zwischen Unterformular und übergeordnetem Hauptformular

Bild 5: Verknüpfung zwischen Unterformular und übergeordnetem Hauptformular

Unterformular-Steuerelement

Nach diesen Vorbereitungsarbeiten kümmern wir uns um die Anzeige der verschiedenen Unterformulare in dem Hauptformular, das auch das TreeView-Steuerelement enthält. Dazu fügen Sie zunächst ein noch leeres Unterformular-Steuerelement zum Formular frmKundenBestellungenArtikel_Unterformular hinzu. Das Unterformular-Steuerelement soll den Namen sfm erhalten, das Bezeichnungsfeld benennen Sie in lblUnterformular um. Die Steuerelemente sollen schließlich etwa wie in Bild 6 angeordnet sein.

TreeView-Steuerelement und Unterformular zur Anzeige der Detaildaten im Entwurf

Bild 6: TreeView-Steuerelement und Unterformular zur Anzeige der Detaildaten im Entwurf

Aktion bei Mausklick

Nun haben wir ein TreeView-Steuerelement und ein leeres Unterformular-Steuerelement sowie eine Reihe von Unterformularen, die zu verschiedenen Zeitpunkten eingeblendet werden sollen. Damit dies geschieht, müssen wir für das TreeView-Steuerelement ein entsprechendes Ereignis anlegen.

Die Deklaration der Objektvariablen, welche das TreeView-Steuerelement referenziert, übernehmen wir aus dem Beispiel des oben beschriebenen Artikels:

Dim WithEvents m_Treeview As MSComctlLib.TreeView

Hier kommt bereits das Schlüsselwort WithEvents zum Einsatz, das dafür sorgt, dass wir die Ereignisse des deklarierten Objekts über die beiden Kombinationfelder des VBA-Editors auswählen und dadurch entsprechende Ereignisprozeduren anlegen können.

In diesem Fall wählen Sie dort im linken Kombinationsfeld den Eintrag m_TreeView und im rechten Kombinationsfeld den Eintrag NodeClick aus. Dies erzeugt die gewünschte leere Ereignisprozedur (siehe Bild 7).

Anlegen einer Ereignisprozedur für das Anklicken eines Node-Elements

Bild 7: Anlegen einer Ereignisprozedur für das Anklicken eines Node-Elements

Zur Erinnerung: Es gibt auch noch ein Ereignis namens Click, aber dieses unterscheidet sich vor allem dadurch von Node_Click, dass es keine Referenz auf das angeklickte Element liefert – und genau das benötigen wir ja, um das richtige Unterformular mit dem passenden Datensatz anzuzeigen.

Wir wollen zunächst prüfen, ob die Ereignisprozedur Node_Click funktioniert und ergänzen den Code dieser Prozedur um eine einzige Anweisung:

Private Sub m_Treeview_NodeClick( ByVal Node As MSComctlLib.Node)

     Debug.Print Node.Key

End Sub

Die von der Prozedur gelieferte Parameter Node liefert eine Objektvariable, mit der Sie auf die Eigenschaften des angeklickten Node-Elements zugreifen können. In diesem Fall geben wir den Wert der Eigenschaft Key im Direktfenster aus, also beispielsweise k146 (für einen Kunden), b5 (für eine Bestellung) oder p17 (für eine Bestellposition).

Im Artikel Das TreeView-Steuerelement: Verknüpfte Daten, Teil I haben Sie erfahren, dass der Key-Wert der Kunden-Nodes immer den Buchstaben k und den Primärschlüsselwert des jeweiligen Kundendatensatzes enthält. Bei Bestellungen und Bestellpositionen verwenden wir die Buchstaben b und p zur Unterscheidung der verschiedenen Knotentypen. Im erwähnten Artikel war das Hauptziel dabei, zu verhindern, dass Datensätze aus verschiedenen Tabellen, aber mit identischen Primärschlüsselwerten, zu doppelten Key-Werten im TreeView führen.

Das haben wir ganz gut gemacht, denn nun können wir aufgrund des führenden Buchstabens ermitteln, ob der Benutzer einen Kunden, eine Bestellung oder eine Bestellposition angeklickt hat. Und über die folgende Zahl können wir über den Primärschlüsselwert den entsprechenden Datensatz der Tabelle ermitteln.

Außerdem lässt sich so natürlich direkt das passende Unterformular einblenden. Zunächst wollen wir jedoch die Select Case-Bedingung anlegen und entsprechende Meldungen ausgeben, um die Bedingung zu prüfen. Die Prozedur aus Listing 1 deklariert zunächst zwei Variablen. Die String-Variable strKey soll den führenden Buchstaben aufnehmen, die Long-Variable lngKey den Primärschlüsselwert, der ab dem zweiten Zeichen des Wertes der Key-Eigenschaft beginnt.

Private Sub m_Treeview_NodeClick(ByVal Node As MSComctlLib.Node)

     Dim strKey As String

     Dim lngKey As Long

     strKey = Left(Node.Key, 1)

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!