Navigationssteuerelement in der Praxis

Das Navigationssteuerelement ermöglicht ein einfaches Handling von Unterformularen. Sie können damit etwa immer das gleiche Formular als Unterformular anzeigen und die Daten je nach gedrückter Navigationsschaltfläche filtern – beispielsweise um Artikel nach Kategorien zu sortieren oder nach dem Alphabet zu filtern. Dieser Beitrag zeigt, wie Sie eine solche Lösung erstellen – aber auch, wie Sie sich die Arbeit beim Erstellen des Formulars per VBA vereinfachen können.

Wenn Sie beispielsweise ein Navigationssteuerelement erstellen, mit dem Sie die Artikel oder Kunden in einer Datenbank nach dem Alphabet filtern möchten, ist erstmal umfangreiche Handarbeit gefragt: Immerhin wollen zumindest 26 Schaltflächen für den Aufruf eines Formulars mit den entsprechenden Filterkriterien erstellt werden.

Da diese Aufgabe eines Access-Entwicklers unwürdig ist, werden wir diese natürlich per VBA automatisieren. Um dies zu erledigen, sind ein paar Grundlagen erforderlich, die wir in einem einfachen Beispiel betrachten.

Ziel ist es, ein einfaches Navigationssteuerelement mit zwei Einträgen in der ersten Ebene und jeweils zwei Einträgen in der zweiten Ebene zu erstellen. Dieses sieht nach der Fertigstellung wie in Bild 1 aus.

pic001.png

Bild 1: Navigationssteuerelement mit verschachtelten Elementen

Die zur Erstellung dieses Formulars verwendete Prozedur nutzt eine Hilfsfunktion, die sich nur um das reine Formular kümmert. Diese heißt NeuesFormular, erwartet den Namen des zu erstellenden Formulars und sieht wie folgt aus:

Public Function NeuesFormular(strForm As String)
    Dim strFormTemp As String
    Dim frm As Form
    On Error Resume Next
    DoCmd.Close acForm, strForm
    DoCmd.DeleteObject acForm, strForm
    On Error GoTo 0
    Set frm = Application.CreateForm
    strFormTemp = frm.Name
    DoCmd.Close acForm, frm.Name, acSaveYes
    DoCmd.Rename strForm, acForm, strFormTemp
End Function

Die Funktion schließt zunächst ein eventuell vorhandenes Formular gleichen Namens und löscht dieses aus der Datenbank. Danach erstellt sie mit der CreateForm-Methode ein Formular-Objekt und speichert den Namen dieses neuen Formulars in der Variablen strFormTemp zwischen. Dies ist nötig, da das Formular im geöffneten Zustand nicht umbenannt werden kann. Also schließt die Funktion das Formular und benennt es dann mit der Rename-Funktion um. Anschließend startet die eigentliche Erstellung des verschachtelten Navigationssteuerelements. Die dazu verwendete Prozedur finden Sie in Listing 1.

Listing 1: Erstellen eines Formulars mit verschachtelter Navigation

Public Sub FormularErstellen()
    Dim frm As Form
    Dim strForm As String
    Dim ctlNavigation As NavigationControl
    Dim ctlSubnavigation As NavigationControl
    Dim ctlButton As NavigationButton
    strForm = "frmNaviPerVBA"
    NeuesFormular strForm
    DoCmd.OpenForm strForm, acDesign
    Set frm = Forms(strForm)
    Set ctlNavigation = Application.CreateControl(strForm, acNavigationControl, acDetail)
    ctlNavigation.Name = "nav"
    Set ctlSubnavigation = Application.CreateControl(strForm, acNavigationControl, acDetail)
    ctlSubnavigation.Name = "navSub"
    Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlNavigation.Name)
    With ctlButton
        .Name = "nab1"
        .Caption = "Button 1"
    End With
    Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name)
    With ctlButton
        .Name = "nab11"
        .Caption = "Button 1-1"
    End With
    Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name)
    With ctlButton
        .Name = "nab12"
        .Caption = "Button 1-2"
    End With
    Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlNavigation.Name)
    With ctlButton
        .Name = "nab2"
        .Caption = "Button 2"
    End With
    Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name)
    With ctlButton
        .Name = "nab21"
        .Caption = "Button 2-1"
    End With
    Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name)
    With ctlButton
        .Name = "nab22"
        .Caption = "Button 2-2"
    End With
    DoCmd.Close acForm, strForm, acSaveYes
End Sub

Die Prozedur ruft zunächst die bereits beschriebene Funktion zum Erstellen des eigentlichen Formulars auf. Dann öffnet sie dieses Formular in der Entwurfsansicht und referenziert es mit der Objektvariablen frm.

Die CreateControl-Methode des Application-Objekts erstellt ein Steuerelement des Typs acNavigationControl, und zwar in dem mit dem dritten Parameter angegebenen Formularbereich – hier dem Detailbereich (acDetail).

Dieses Steuerelement referenziert die Prozedur dann mit der als NavigationControl deklarierten Objektvariablen ctlNavigation. Über die Name-Eigenschaft dieser Variablen legt die Funktion die Bezeichnung nav für das Steuerelement fest.

Wir möchten dem Navigationssteuerelement ein weiteres Navigationssteuerelement unterordnen, was weniger Aufwand als erwartet bedeutet: Sie brauchen dazu nämlich einfach nur ein weiteres Navigationssteuerelement zum Formular hinzuzufügen. Es ist keine Angabe des übergeordneten Navigationssteuerelements nötig, diese Eigenschaft wird automatisch auf das bereits vorhandene Navigationssteuerelement eingestellt.

Allerdings ist diese Eigenschaft weder per VBA noch im Eigenschaftsfenster zu finden – Sie können diese höchstens einsehen, wenn Sie den Quelltext des Formulars per SaveAsText speichern – etwa so:

SaveAsText acForm, "frmNaviPerVBA", currentproject.Path & "\frmNaviPerVBA.txt"

Dort finden Sie dann die Eigenschaft NavigationChild für das übergeordnete Navigationssteuerelement (s. Bild 2) und NavigationParent für das untergeordnete Element vor. In der Anwendung können Sie diese Beziehung nur über die Reihenfolge beim Hinzufügen beeinflussen – genauso wie im vorliegenden VBA-Beispiel.

pic002.png

Bild 2: Quellcode des Formulars frmNaviPerVBA

Das untergeordnete Navigationssteuerelement wird schließlich mit der Variablen ctlSubnavigation referenziert und navSub benannt.

Nun kümmern wir uns um die Schaltflächen. Um diese in das richtige Verhältnis zueinander zu bringen, müssen Sie die Reihenfolge beim Anlegen unter VBA streng einhalten. Als Erstes legen Sie mit der Methode CreateControl das erste Steuerelement des übergeordneten Navigationssteuerelements an. Der erste Parameter dieser Methode erwartet wieder den Namen des Formulars, in dem das Steuerelement landen soll, der zweite den Steuerelementtyp – hier acNavigationButton -, der dritte den Zielbereich und der vierte den Namen des Steuerelements, dem das zu erstellende Steuerelement untergeordnet werden soll.

Die erste Navigationsschaltfläche der ersten Ebene erhält den Namen nab1 und die Beschriftung Button 1.

Bevor wir nun das nächste Element dieser Ebene erstellen, müssen erst die untergeordneten Elemente für das erste Element angelegt werden. Der Grund ist, dass Access beim Anlegen einer Navigationsschaltfläche immer das zuletzt angelegte Element des übergeordneten Navigationssteuerelements als Parent-Element erkennt.

Also legt die Prozedur zunächst die beiden Navigationsschaltflächen nab11 und nab12 mit den Beschriftungen Button 1-1 und Button 1-2 an.

Erst danach werden die zweite Navigationsschaltfläche im ersten Navigationssteuerelement und die beiden diesem untergeordneten Navigationsschaltflächen im zweiten Navigationssteuerelement angelegt.

Schließlich schließt die Prozedur das frisch erstellte Formular.

Artikel alphabetisch sortieren

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar