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.
KeyFieldist erforderlich;TextField,GlyphField,ParentField,SortField,VisibleField,EnabledFieldundPlaceFieldsind optional. Eine Zeile, die eine andere Zeile inParentFieldnennt, ist eine Gruppe. - Ziele.
TargetKindFieldundTargetFieldgeben jedem Eintrag ein Ziel: Ein Unterformularziel wird zumSourceObjectdes Unterformular-Steuerelements, dasTargetControlnennt; 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;
LoadProblemsnennt 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
- Öffnen Sie das Formular mit der Navigationsleiste in der Entwurfsansicht, und öffnen Sie den Designer (Zeile Benutzerdefiniert
[...]im Eigenschaftenblatt). - 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 FeldernKey,Caption,Glyph,ParentKey,SortOrder,Visible,Enabled,Place,TargetKindundTarget, gefüllt mit den entworfenen Einträgen;VisibleundEnablederhalten den Standardwert Ja. Eine entworfene Gruppe ohne Einträge entfällt, weil keine Zeile sie nennt; die Seite gibt an, welche. - Wählen Sie unter Ziele in Unterformular für Seiten (
TargetControl) das Unterformular-Steuerelement, und schließen Sie den Designer mit OK. 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:
Key Caption Glyph ParentKey SortOrder Visible Enabled Place TargetKind Target start Start E80F 1 Yes Yes Subform frmStart data Daten 10 Yes Yes orders Bestellungen E8A5 data 1 Yes Yes Subform frmBestellungen customers Kunden E716 data 2 Yes Yes Form frmKunden options Optionen E713 1 Yes Yes bottom Form frmOptionen - Öffnen Sie das Formular. Die Navigationsleiste zeigt die Zeilen, und
sfPagezeigtfrmStart, wennstartder 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:
VisibleundEnablednehmen 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.SortOrdersortiert Zahlen nach Wert und Text alphabetisch, leere Werte zuletzt.PlacenimmtTop/Bottom,0/1oderoben/untenan, leer bedeutet oben.TargetKindnimmt die Zahlen 0 bis 3 oder die unter „Hinweise“ aufgeführten Wörter an.Glyphnimmt einen Code im Bereich E000 bis F8FF an, als vier Hexadezimalziffern, mit vorangestelltem0x,&HoderU+, oder das Zeichen selbst; leer bedeutet kein Symbol. Führende und nachgestellte Leerzeichen werden überall ignoriert. - Die Längen bestimmen Sie, mit drei Regeln.
Keymuss eindeutig sein; die Navigationsleiste vergleicht Schlüssel ohne Rücksicht auf Groß- und Kleinschreibung.ParentKeyenthält Schlüssel und muss daher mindestens so lang sein wieKey, sonst lässt sich eine Gruppe mit einem langen Schlüssel nicht nennen.Targetnennt 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.BottominPlaceeiner Gruppenzeile wird ignoriert, undLoadProblemsnennt die Zeile. - Zielarten sind die Zahlen von
WklNavTargetKindoder die WörterSubform,Form,Report(auchUnterformular,Formular,Bericht). Die Navigationsleiste setzt den Namen eines Unterformularziels unverändert alsSourceObjectdes Unterformular-Steuerelements; ein Formularname und eine Tabelle in der FormTable.tblOrdersfunktionieren daher beide. - Ereignisse treten weiterhin ein. Eine Auswahl des Benutzers löst
BeforeNavigateaus (das sie abbrechen kann), bevor die Navigationsleiste das Ziel anzeigt, und danachNavigate. Einträge ohne Ziel überlassen allesNavigate, 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 denForm_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
Visiblehinzugefü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;
Itemsbehä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ächstenRequeryhinzufügen, ändern und entfernen. - Der Laufzeitzustand bleibt über
Requeryerhalten. 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
RequerylöstwkeSourceErroraus („Die Leiste steht in keinem Access-Formular.“).
Verwandte Themen
- Auf einer Seite mit ungespeicherten Änderungen bleiben – die Prüfung im eigenen Code, für eine ungebundene Navigationsleiste
- Formulare über die Navigationsleiste öffnen – Formulare in eigenen Fenstern mit einer ungebundenen Navigationsleiste
- API-Referenz (Englisch): WklNavBar (
RecordSource,TargetKindField,TargetControl,NavigateOnOpen,ConfirmUnsavedChanges,Requery,LoadProblems)