Barvna shema: Temna
Trenutno dejavna stran: start » de » Dokumentation » Werkzeuge für Microsoft Access » WKL Forms Object Library » how-to » Navigationsleiste aus einer Tabelle füllen

Navigationsleiste aus einer Tabelle füllen

Führen Sie die Gruppen, Einträge und Seiten einer WklNavBar in einer Tabelle des Frontends. Eine neue Seite ist dann eine neue Zeile statt einer Änderung an Formular und Code.

Voraussetzungen: WKL Forms Object Library 1.26 oder höher.

Lösungsüberblick

Eine gebundene Navigationsleiste liest ihre Gruppen und Einträge aus RecordSource (Tabelle, Abfrage oder SQL-Anweisung) und zeigt das Ziel eines Eintrags selbst an, ohne Code in Navigate:

  • Felder. KeyField ist erforderlich; TextField, GlyphField, ParentField, SortField, VisibleField, EnabledField und PlaceField sind optional. Eine Zeile, die eine andere Zeile in ParentField nennt, ist eine Gruppe.
  • Ziele. TargetKindField und TargetField geben jedem Eintrag ein Ziel: Ein Unterformularziel wird zum SourceObject des Unterformular-Steuerelements, das TargetControl nennt; ein Formular- oder Berichtsziel öffnet sich in einem eigenen Fenster.
  • Startseite. NavigateOnOpen (Standardwert True) zeigt beim Öffnen des Formulars einmal das Ziel des im Entwurf ausgewählten Eintrags an, ohne Ereignisse.
  • Ungespeicherte Änderungen. ConfirmUnsavedChanges (Standardwert True) fragt nach, bevor ein Unterformularziel eine Seite mit einem ungespeicherten Datensatz ersetzt.
  • Probleme. Eine fehlerhafte Zeile hält das Formular nie an; LoadProblems nennt jede Zeile, die übersprungen oder ohne einen fehlerhaften Wert angezeigt wurde.

Der Designer stellt all das ohne Code ein: Zeile Benutzerdefiniert [...], Seite Datenquelle. Seine Schaltfläche Vorlagetabelle anlegen legt eine Tabelle mit den entworfenen Einträgen an und bindet die Navigationsleiste daran.

Umsetzung

  1. Öffnen Sie das Formular mit der Navigationsleiste in der Entwurfsansicht, und öffnen Sie den Designer (Zeile Benutzerdefiniert [...] im Eigenschaftenblatt).
  2. Wählen Sie auf der Seite Datenquelle die Schaltfläche Vorlagetabelle anlegen (Tabellenname tblNavigation, sofern Sie ihn nicht ändern). Die Navigationsleiste erhält eine Tabelle mit den Feldern Key, Caption, Glyph, ParentKey, SortOrder, Visible, Enabled, Place, TargetKind und Target, gefüllt mit den entworfenen Einträgen; Visible und Enabled erhalten den Standardwert Ja. Eine entworfene Gruppe ohne Einträge entfällt, weil keine Zeile sie nennt; die Seite gibt an, welche.
  3. Wählen Sie unter Ziele in Unterformular für Seiten (TargetControl) das Unterformular-Steuerelement, und schließen Sie den Designer mit OK.
  4. Tragen Sie die Ziele in die Tabelle ein. Ein Beispiel mit einer Gruppe „Daten“, einer Seite im Unterformular, einem Formular in einem eigenen Fenster und einem Eintrag am unteren Rand:

    KeyCaptionGlyphParentKeySortOrderVisibleEnabledPlaceTargetKindTarget
    startStartE80F1YesYesSubformfrmStart
    dataDaten10YesYes
    ordersBestellungenE8A5data1YesYesSubformfrmBestellungen
    customersKundenE716data2YesYesFormfrmKunden
    optionsOptionenE7131YesYesbottomFormfrmOptionen
  5. Öffnen Sie das Formular. Die Navigationsleiste zeigt die Zeilen, und sfPage zeigt frmStart, wenn start der im Entwurf ausgewählte Eintrag ist.

Tabelle aus Text anlegen

Eine Anwendung, die aus Text gebaut wird (zum Beispiel mit dem Build-Werkzeug), legt die Tabelle statt mit dem Designer mit einer Anweisung an. Diese hier erzeugt dieselben Spalten wie Vorlagetabelle anlegen:

CREATE TABLE tblNavigation (
    [KEY] TEXT(50) CONSTRAINT pkNavigation PRIMARY KEY,
    [Caption] TEXT(100), [Glyph] TEXT(10), [ParentKey] TEXT(50), [SortOrder] LONG,
    [Visible] YESNO, [Enabled] YESNO, [Place] TEXT(10), [TargetKind] TEXT(20), [Target] TEXT(64))

Was verbindlich ist und was frei:

  • Die Namen sind nur so weit verbindlich, wie die Feldeigenschaften sie nennen (KeyField, TextField …). Bei anderen Spaltennamen setzen Sie die Eigenschaften auf diese Namen.
  • Die Typen sind frei. Die Navigationsleiste liest jeden Wert über die Datenherkunft und deutet ihn: Visible und Enabled nehmen Ja/Nein, Zahlen (0 ist Nein) oder die Wörter Yes/No, True/False, Ja/Nein, Wahr/Falsch an; ein leerer Wert gilt als Ja. SortOrder sortiert Zahlen nach Wert und Text alphabetisch, leere Werte zuletzt. Place nimmt Top/Bottom, 0/1 oder oben/unten an, leer bedeutet oben. TargetKind nimmt die Zahlen 0 bis 3 oder die unter „Hinweise“ aufgeführten Wörter an. Glyph nimmt einen Code im Bereich E000 bis F8FF an, als vier Hexadezimalziffern, mit vorangestelltem 0x, &H oder U+, oder das Zeichen selbst; leer bedeutet kein Symbol. Führende und nachgestellte Leerzeichen werden überall ignoriert.
  • Die Längen bestimmen Sie, mit drei Regeln. Key muss eindeutig sein; die Navigationsleiste vergleicht Schlüssel ohne Rücksicht auf Groß- und Kleinschreibung. ParentKey enthält Schlüssel und muss daher mindestens so lang sein wie Key, sonst lässt sich eine Gruppe mit einem langen Schlüssel nicht nennen. Target nennt ein Formular oder einen Bericht; 64 Zeichen, die Grenze für Access-Objektnamen, genügen also immer.

Dieselbe Bindung per Code, zum Beispiel in einem Formular, das zur Laufzeit aufgebaut wird:

Private Sub Form_Load()
    With Me!navMain.Object
        .RecordSource = "tblNavigation"
        .KeyField = "Key": .TextField = "Caption": .GlyphField = "Glyph"
        .ParentField = "ParentKey": .SortField = "SortOrder"
        .VisibleField = "Visible": .EnabledField = "Enabled": .PlaceField = "Place"
        .TargetKindField = "TargetKind": .TargetField = "Target"
        .TargetControl = "sfPage"
        If Len(.LoadProblems) > 0 Then Debug.Print .LoadProblems
    End With
End Sub

Rufen Sie nach einer Änderung der Tabelle bei geöffnetem Formular Requery auf:

Public Sub RefreshNavigation()
    Forms!frmShell!navMain.Object.Requery
End Sub

Hinweise

  • Der Platz gilt für Einträge. Eine Gruppe steht immer oben; ihre Stelle unter den Zeilen oben ergibt sich aus SortOrder. Bottom in Place einer Gruppenzeile wird ignoriert, und LoadProblems nennt die Zeile.
  • Zielarten sind die Zahlen von WklNavTargetKind oder die Wörter Subform, Form, Report (auch Unterformular, Formular, Bericht). Die Navigationsleiste setzt den Namen eines Unterformularziels unverändert als SourceObject des Unterformular-Steuerelements; ein Formularname und eine Tabelle in der Form Table.tblOrders funktionieren daher beide.
  • Ereignisse treten weiterhin ein. Eine Auswahl des Benutzers löst BeforeNavigate aus (das sie abbrechen kann), bevor die Navigationsleiste das Ziel anzeigt, und danach Navigate. Einträge ohne Ziel überlassen alles Navigate, wie in einer ungebundenen Navigationsleiste.
  • Die Navigationsleiste folgt ihren Formularzielen. Wird ein als Ziel geöffnetes Formular zum aktiven Fenster (Fenster, Dokumentregisterkarte, Strg+F6, DoCmd.SelectObject), wählt die Navigationsleiste ohne Ereignisse dessen Eintrag aus. Das ersetzt den Form_Activate-Code, den Formulare über die Navigationsleiste öffnen für eine ungebundene Navigationsleiste braucht.
  • Ja/Nein-Spalten sind in Access nie Null. Eine ohne Wert in Visible hinzugefügte Zeile ist Nein und daher ausgeblendet; die Vorlagetabelle gibt beiden Spalten den Standardwert Ja.
  • Was die Tabelle ersetzt. Die Zeilen ersetzen die entworfenen Einträge in der Navigationsleiste; Items behält die entworfenen Einträge, die mit dem Formular gespeichert und angezeigt werden, wenn sich die Quelle nicht lesen lässt. Code kann Einträge einer gebundenen Navigationsleiste bis zum nächsten Requery hinzufügen, ändern und entfernen.
  • Der Laufzeitzustand bleibt über Requery erhalten. Auswahl, Badges und eingeklappte Gruppen bleiben für Schlüssel erhalten, die weiterhin vorhanden sind; es tritt kein Ereignis ein.
  • Eine gespeicherte Abfrage darf Formularsteuerelemente als Parameter nennen; die Navigationsleiste füllt sie so, wie Access es tut, wenn ein Formular die Abfrage öffnet. So lassen sich zum Beispiel Einträge je Benutzerrolle anzeigen.
  • Nur Access-Formulare. Die Navigationsleiste liest die Tabelle über die Access-Instanz ihres Formulars. Auf einer UserForm von Excel oder Word gibt es keine: Die Navigationsleiste zeigt die entworfenen Einträge, und Requery löst wkeSourceError aus („Die Leiste steht in keinem Access-Formular.“).

Verwandte Themen

de/wiki/msaccess/comctl/how-to/fill-the-navigation-bar-from-a-table.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille