Access
 sql >> Datenbank >  >> RDS >> Access

Zugriffsmenü mit Baumansichtssteuerung erstellen

Das Microsoft Access-Projektmenü sieht, wenn es mit der Baumansichtssteuerung fertig ist, wie das unten gezeigte Bild aus.

Das obige Bild zeigt die dritte Option der Berichtsgruppe Benutzerdefinierter Bericht wird ausgewählt und hervorgehoben, wobei das Berichtsfilter-Parameterformular geöffnet ist und den Menübildschirm für Benutzereingaben überlappt.

Bevor wir darauf eingehen, haben wir in der Lektion der letzten Woche gelernt, wie Sie die zugehörigen Elemente in hierarchischer Reihenfolge mithilfe der Microsoft-Baumansichtssteuerung basierend auf dem Beispiel organisieren Datentabelle.

Ich habe letzte Woche darauf hingewiesen, dass die zugehörigen Elemente in den Daten des Tree View-Steuerelements nicht unbedingt nebeneinander liegen müssen. Danach wissen Sie besser, wie Sie Relativ aktualisieren Schlüssel von untergeordneten Knoten, unabhängig von ihrer physischen Position der Datensätze in der Tabelle, aber basierend auf der Beziehung zu ihren übergeordneten Knoten-IDs.

Dies war die Datentabelle, die wir verwendet und mit der Übung der letzten Woche abgeschlossen haben:

Können Sie die folgende Liste von Elementen am Ende der obigen Tabelle hinzufügen und ihre ParentID-Feldwerte aktualisieren, sodass die TreeView-Anzeige wie das unten angegebene Beispielbild aussieht:

Neue Rekorde für Table Artikeldatensatzbezogenes Feld :

  1. Textfeld.
  2. Zahlenfeld.
  3. Datums-/Zeitfeld.
  4. Hyperlink-Feld.

Formular zugehörige Steuerelemente:

  1. Textfeld.
  2. Befehlsschaltflächen.
  3. Kombinationsfeld.
  4. Listenfeld.

Bericht zugehörige Steuerelemente:

  1. Textfeld.
  2. Etikett.
  3. Diagramm.

Weisen Sie diesen Elementen ParentID-Werte zu, sodass die Baumansicht wie im folgenden Bild aussieht:

Jetzt werden wir mit der Erstellung eines MS-Access-Projektmenüs fortfahren und lernen, was es braucht, um eines zu erstellen. Ein einfaches Menübild ist unten angegeben:


Es ist ein einfaches Menü mit nur drei Optionsgruppen:Formulare, Berichtsansichten und Makros.

Unter Formulare Es werden Optionen der Gruppe zwei angegeben, die erste zeigt den Menütabellendatensatz der Baumansicht-Steuerelemente an. Die zweite Option zeigt dieselben Datensätze im Endlosformularmodus an.

Die erste Option unter Berichtsansicht zeigt einen Bericht zu Produkten Kategorie an Datensätze aus der Kategorientabelle von NorthWind.accdb Datenbank.

Die zweite Option zeigt den Produktlistenpreisbericht an.

Der dritte Option öffnet einen Parameter Formular, damit der Benutzer die Min festlegen kann imum und Max Maximaler Listenpreis-Wertebereich, um Daten für den Listenpreisbericht für Produkte zu filtern.

Unter den Makros Prozesse Group führen beide Optionen Macro1 aus und Makro2 bzw. unterschiedliche Meldungen anzeigen.

Wir benötigen eine Menütabelle mit den obigen Optionsdatensätzen mit einigen zusätzlichen Feldern, neben den üblichen TreeView-Datenfeldern Unique IDs, Description und ParentID. Das Bild der Menütabelle ist unten angegeben:

Erstellen Sie eine Tabelle mit der obigen Struktur, fügen Sie die obigen Datensätze hinzu und speichern Sie sie unter dem Namen Menü . Die ID Feld ist AutoNumber, PID, und Typ Felder sind numerische Felder, andere sind Textfelder.

Wir kennen die ersten drei Datenfelder:die eindeutige ID , Beschreibung und die ParentID Felder. Hier habe ich den ParentID-Feldnamen zu PID gekürzt .

Wir brauchen vier weitere Felder in der Menütabelle, ein Feld Typ für den Objekttyp Code und drei Felder Formular , Bericht, und Makro .

Typ Das Feld enthält die numerischen Codes des Zugriffsobjekttyps, um die Option zu identifizieren, auf die der Benutzer geklickt hat.

  • Das Formularfeld ist für Formularnamen Objekttypcode 1,
  • Berichtsfeld enthält Berichtsnamen Objekttypcode 2,
  • Makrofeld ist für Makronamen Objekttypcode 3.

Hinweis: Alle Objektnamen können in eine Spalte gestellt werden. Wir haben separate Felder nur aus Gründen der Übersichtlichkeit verwendet. Wenn Sie das tun, nehmen Sie Änderungen im VBA-Code vor, wo immer er auf andere Feldnamen verweist.

Anhand der Codenummern können wir die Objektnamen aus den jeweiligen Feldern entnehmen und das DoCmd.Openform aufrufen oder Docmd.OpenReport oder Docmd.RunMacro um die Aktion auf die Klicks des untergeordneten Knotens auszuführen.

Jetzt müssen wir den Typcode und den Objektnamen auf den untergeordneten Knoten speichern. Wir werden dieses Thema aufgreifen, wenn wir mit dem Hinzufügen der Knoten zur Baumansichtssteuerung beginnen.

Wir benötigen zwei weitere Datentabellen für Beispielformulare und -berichte. Die Kategorien Tabelle und Produkte Tabellen aus der NorthWind.accdb Beispieldatenbank. Um Ihnen Zeit zu sparen, habe ich am Ende dieser Seite die Demo-Datenbank mit allen Objekten und Programmen zum Herunterladen und Ausprobieren angehängt.

Erstellen Sie mithilfe der Menütabelle zwei Formulare mit den Namen Data Entry und ein weiteres Formular Datenansicht kontinuierlich Formularmodus.

Erstellen Sie zwei Berichte, einen in der Kategorientabelle mit dem Berichtsnamen:Kategorien, ein weiterer Bericht über die Produkttabelle mit dem Namen Produktliste . Fügen Sie ein langes Label hinzu unter der Hauptüberschrift im Produktauflistungsbericht und ändern Sie den Namenseigenschaftswert in Bereich .

Erstellen Sie ein kleines Formular mit zwei ungebundenen TextBoxen und ändern Sie deren Namen Property Value in Min &Max, wie das unten angegebene Design:

Fügen Sie wie oben gezeigt zwei Befehlsschaltflächen hinzu. Ändern Sie die Beschriftung Eigenschaftswert der ersten Schaltfläche zum Öffnen des Berichts t und den Namen Eigenschaftswert zu cmdReport .

Ändern Sie die Beschriftung der zweiten Befehlsschaltfläche in Abbrechen und der Name Eigenschaftswert zu cmdCancel .

Zeigen Sie das Codemodul des Formulars an. Kopieren Sie den folgenden Code, fügen Sie ihn in das Formularmodul ein und speichern Sie das Formular:

Private Sub cmdOpen_Click()Dim mn, mx, fltr As Stringmn =Nz(Me![Min], 0)mx =Nz(Me![Max], 9999)If (mn + mx)> 0 Then fltr ="[Listenpreis]> " &mn &" And " &"[Listenpreis] <=" &mx DoCmd.OpenReport "Produktliste", acViewReport, , fltr, , fltrElse DoCmd.OpenReport "Produktliste", acViewReportEnd IfEnd SubPrivate Sub cmdCancel_Click()DoCmd.CloseEnd Sub

Wenn der Benutzer einen Wertebereich festlegt, indem er den minimalen und maximalen Listenpreisbereich in die entsprechenden Textfelder eingibt, wird die Kriterienzeichenfolge für den Berichtsfilter erstellt. Der Berichtsfilter Der Stringwert wird an die Produktliste übergeben Bericht als Open Report-Befehlsparameter. Der Wert der Filterzeichenfolge wird auch als OpenArgs übergeben (Argument öffnen) Parameter.

Der Parameter „Filter“ filtert die Berichtsdaten basierend auf den Kriterien, die in den Feldern „Min“ und „Max“ angegeben sind, und der offene Argumentwert wird in den Bereich kopiert Beschriftungstext, wenn der Bericht geöffnet ist.

Kopieren Sie den folgenden Code und fügen Sie ihn in die Produktliste ein VBA-Modul des Berichts:

Private Sub Report_Open(Cancel As Integer) DoCmd.Close acForm, "Parameter" Me.Range.Caption =Nz(Me.OpenArgs, "")End Sub
  1. Erstellen Sie ein neues Formular mit dem Namen frmMenu, und fügen Sie das Microsoft TreeView Control hinzu aus der Liste des Activex-Steuerelements. Ändern Sie die Größe des Steuerelements wie in der Entwurfsansicht unten gezeigt:

  2. Ändern Sie den Namen des Tree View-Steuerelements in TreeView0 im normalen Property Sheet.

  3. Fügen Sie unterhalb des Strukturansicht-Steuerelements eine Befehlsschaltfläche hinzu. Ändere seinen Namen Eigenschaftswert zu cmdExit und Bildunterschrift Eigenschaftswert zum Beenden .

  4. Klicken Sie mit der rechten Maustaste auf das Tree View Control und markieren Sie das TreeCtrl_Object Option und wählen Sie Eigenschaften um das Property Sheet anzuzeigen.

  5. Ändern Sie die folgenden Eigenschaftswerte wie unten angegeben:

  • Stil =7 (tvwTreeLinesPlusMinusPictureText)
  • Linienstil =1 (tvwRootLines)
  • LabelEdit =1 (tvwManual)

Letzte Woche haben wir die ersten beiden Eigenschaftswerte geändert. Wenn LabelEdit Der Standardwert der Eigenschaft ist 0 - tvwAutomatisch, Wenn Sie zweimal auf den Knoten klicken (nicht doppelklicken), wechselt der Knotentext in den Bearbeitungsmodus und Sie können den Text ändern. Das Datenquellenfeld wird jedoch nicht direkt aktualisiert. Durch Ändern auf 1 – tvwManual verhindert, dass es in den Bearbeitungsmodus wechselt.

Wir können dies durch Code ändern, indem wir die folgenden Zeilen in der Form_Load()-Ereignisprozedur hinzufügen:

With Me.TreeView0.Object .Style =tvwTreelinesPlusMinusPictureText .LineStyle =tvwRootLines .LabelEdit =tvwManualEnd With

Letzte Woche haben wir das Form_Load() verwendet Ereignisprozedur zum Lesen der Werte des Baumansichtsknotens zum Erstellen der Root-Level- und untergeordneten Knoten. Wir brauchen hier die gleiche Prozedur auch mit ein paar Zeilen zusätzlichen Codes.

Außerdem müssen wir Node_Click() abfangen Event of Nodes, um zu überprüfen, welche Option der Benutzer ausgewählt hat.

Kopieren Sie den folgenden VBA-Code, fügen Sie ihn in das Formularmodul ein und speichern Sie das Formular.

Option Compare DatabaseOption ExplicitDim tv As MSComctlLib.TreeViewConst KeyPrfx As String ="X"Private Sub Form_Load()Dim db As DatabaseDim rst As RecordsetDim nodKey As StringDim PKey As StringDim strText As StringDim strSQL As StringDim tmpNod As MSComctlLib.NodeDim Typ As VariantSet tv =Me.TreeView0.Objecttv.Nodes.Clear

‘Eigenschaften des TreeView-Steuerelements ändern

Mit tv
.Style =tvwTreelinesPlusMinusPictureText
.LineStyle =tvwRootLines
.LabelEdit =tvwManual
.Font.Name ="Verdana"
Ende mit

strSQL ="SELECT ID, Desc, PID, Type,Macro,Form,Report FROM Menu;"Set db =CurrentDbSet rst =db.OpenRecordset(strSQL, dbOpenDynaset)Do While Not rst.EOF And Not rst.BOF If Nz(rst !PID, "") ="" Then nodKey =KeyPrfx &CStr(rst!ID) strText =rst!Desc Set tmpNod =tv.Nodes.Add(, , nodKey, strText) 'Stammknotenbeschreibung in Fettschrift mit tmpNod .Bold =True End With Else PKey =KeyPrfx &CStr(rst!PID) nodKey =KeyPrfx &CStr(rst!ID) strText =rst!Desc Set tmpNod =tv.Nodes.Add(PKey, tvwChild, nodKey, strText) 'Überprüfen Sie, ob der Typcode vorhanden ist. Wenn Nz(rst!Type, 0)> 0 Then Typ =rst!Type Select Case Typ Case 1 'save type Code &Form Name in Node Tag Property tmpNod.Tag =Typ &rst!Form Fall 2 'save type Code &Report Name in Node Tag Property tmpNod.Tag =Typ &rst!Report Case 3 ' save type Code &Macro Name in Node Tag Property tmpNod.Tag =Typ &rst!Macro End Select End If End If rst.MoveNextLooprst.CloseSet rst =NothingSet db =NothingEnd SubPrivate Sub cmdExit_Click()If MsgBox("Close Menu Form? ", vbYesNo, "cmdExit_Click()") =vbYes Then DoCmd.CloseEnd IfEnd SubPrivate Sub TreeView0_NodeClick(ByVal Node As Object)Dim varTag, typeid As IntegerDim objName As String, nodOn as MSComctlLib.NodeIf Node.Expanded =False Then Node.Expanded =TrueElse Node.Expanded =FalseEnd If

„Vorherige Ampel auf Normal zurücksetzen

Für jedes nodOn in tv.Nodes
nodOn.BackColor =vbWhite
nodOn.ForeColor =vbBlack
Next

‘ändert BackColor in Hellblau und ForeColor Weiß

tv.Nodes.Item(Node.Key).BackColor =RGB(0, 143, 255)
tv.Nodes.Item(Node.Key).ForeColor =vbWhite

‘—Markierungscode endet-

varTag =Nz(Node.Tag, "")If Len(varTag)> 0 Then typeid =Val(varTag) objName =Mid(varTag, 2)End IfSelect Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Fall 3 DoCmd.RunMacro objNameEnd SelectEnd Sub

Im globalen Deklarationsbereich des Moduls wird das Baumansichtsobjekt deklariert. Eine konstante Variable KeyPrfx wird mit dem Wert „X“ deklariert.

Das Form_Load() Das Ereignisverfahren des Artikels der letzten Woche haben wir mit zusätzlichem Code geändert. Ich habe das neue Code-Segment kommentiert, um einen Hinweis darauf zu geben, was es tut, aber ich werde erklären, was es tut.

Die Prozedur deklariert Database, Recordset und vier String-Variablen. Die nächsten beiden Zeilen deklarieren ein temporäres Node-Objekt:tmpNod und Typ Variant-Variablen werden deklariert.

Als nächstes das TreeView-Objekt tv wird dem TreeView0 zugewiesen Objekt auf dem Formular. Die vorhandenen Nodes von TreeView0 werden, falls vorhanden, mit der Anweisung gelöscht:tv.Nodes.Clear , in Vorbereitung auf das erneute Laden aller Knoten.

Wir haben den folgenden Code implementiert, um die Eigenschaften des Tree View-Steuerelements über den Code und nicht über das Eigenschaftenblatt zu ändern.

With tv .Style =tvwTreelinesPlusMinusPictureText .LineStyle =tvwRootLines .LabelEdit =tvwManual .Font.Name ="Verdana"End With 

Die Schriftart der Baumansicht wird in Verdana. geändert Außerdem werden wir einige weitere Funktionen einführen, wie das Erweitern oder Reduzieren aller Menügruppen mit einem Klick, anstatt manuell eine Gruppe nach der anderen zu erweitern oder zu reduzieren.

Die neue SQL-Zeichenfolge wird geändert, um die neuen Felder Typ, Formular, Bericht und Makrofelder aus der Menütabelle hinzuzufügen.

Der erste Datensatz der Menütabelle wird auf das Vorhandensein eines Werts in der PID überprüft Wenn es leer ist, handelt es sich um einen Knotendatensatz auf Stammebene. Es wird dem Tree View-Objekt als Root-Level-Knoten hinzugefügt und seine Referenz wird im tmpNod gespeichert Objekt.

Der Knoten hat mehrere Eigenschaften wie Forecolor, Bold, und einigen anderen haben wir den Bold genommen Property und zugewiesen True um die Root-Ebene zu erstellen Knoten sehen anders aus als ihre untergeordneten Knoten.

Wenn es sich nicht um einen Root-Node-Eintrag handelt, dann hat es den PID-Wert, das Programm nimmt das Else -Klausel und der Datensatz wird als untergeordneter Knoten hinzugefügt. Hier überprüfen wir den Typ Feldwert. Wenn es einen der drei Werte 1, 2, enthält oder 3 dann müssen wir den Wert aus dem Formular-, Berichts- oder Makronamen zusammen mit dem Typencode nehmen und sie zusammenfügen (wie "1Dateneingabe"). , "2Kategorie-Auflistung" etc.) und im Tag speichern Eigenschaft von untergeordneten Knoten. Wir sind mit der Tag-Eigenschaft in Zugriffssteuerungen wie TextBoxen, Beschriftungen, Befehlsschaltflächen und anderen vertraut, aber wir verwenden sie selten.

Der cmdExit_Click() Das Verfahren schließt das Menüformular, wenn die Antwort des Benutzers zustimmend ist.

Wenn der Benutzer auf einen untergeordneten Knoten klickt, den Wert, den wir in seinem Tag gespeichert haben Eigentum muss extrahiert und überprüft werden, um zu bestimmen, was als nächstes zu tun ist. Dazu benötigen wir ein TreeView0_NodeClick() Ereignisprozedur.

Private Sub TreeView0_NodeClick(ByVal Node As Object)Dim varTag, typeid As IntegerDim objName As String, nodOn as MSComctlLib.NodeIf Node.Expanded =False Then Node.Expanded =TrueElse Node.Expanded =FalseEnd If

„Vorherige Ampel auf Normal zurücksetzen

Für jedes nodOn In tv.Nodes nodOn.BackColor =vbWhite nodOn.ForeColor =vbBlackNext nodOn

'ändert BackColor in Hellblau und ForeColor Weiß varTag =Nz(Node.Tag, "")If Len(varTag)> 0 Then typeid =Val(varTag) objName =Mid(varTag, 2)End IfSelect Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Fall 3 DoCmd.RunMacro objNameEnd SelectEnd Sub

Die Click()-Ereignisprozedur erhält die angeklickte Knotenreferenz als Parameter im Objekt Node . Zu Beginn dieser Prozedur haben wir einige Variablen deklariert.

Die nächsten Zeilen prüfen, ob sich der angeklickte Knoten in einem erweiterten oder reduzierten Zustand befindet.

Normalerweise, um einen Knoten zu erweitern, um seine versteckten untergeordneten Knoten anzuzeigen, klicken wir entweder auf das + (Plus-Symbol) auf der linken Seite eines Knotens oder doppelklicken Sie auf den Knoten selbst. Ein erneuter Doppelklick auf den Knoten oder ein Klick auf das – (Minuszeichen) blendet die untergeordneten Knoten aus.

Mit dem folgenden Code-Segment können wir Child-Nodes mit einem einzigen Klick erweitern oder reduzieren:

If Node.Expanded =False Then Node.Expanded =TrueElse Node.Expanded =FalseEnd If 

Die nächsten sechs ausführbaren Zeilen stellen sicher, dass der Knoten, der den Klick erhalten hat, hervorgehoben bleibt.

„Vorheriges Highlight auf Normal zurücksetzen

Für jedes nodOn In tv.Nodes nodOn.BackColor =vbWhite nodOn.ForeColor =vbBlackNext nodOn

'Ändert BackColor in Hellblau und ForeColor Weiß

Als nächstes wird der Tag-Eigenschaftswert in das varTag eingelesen Variable. Wenn es nicht leer ist, wird der Wert in zwei Teile geteilt. Der numerische Wert wird extrahiert und in der Typid gespeichert Variable und der Teil des Objektnamens wird in der Variablen objName gespeichert .

Abhängig vom Wert in der Typid-Variablen wird die Docmd wird ausgeführt, um das Formular, den Bericht oder das Makro zu öffnen.

Wir werden zwei weitere Befehlsschaltflächen oben im Menü hinzufügen. Eine, um alle Knoten mit einem Klick zu erweitern und die zweite, um alle Knoten zu reduzieren.

  1. Fügen Sie zwei weitere Befehlsschaltflächen im oberen Bereich der Baumansichtssteuerung hinzu, wie auf dem Design unten gezeigt.
  2. Ändern Sie den Namen Eigenschaftswert der linken Befehlsschaltfläche auf cmdExpand und die Bildunterschrift auf Alle erweitern .
  3. Ändern Sie auf ähnliche Weise den Namen der Befehlsschaltfläche auf der rechten Seite Eigenschaft auf cmdCollapse und die Bildunterschrift auf Alle minimieren.
  4. Kopieren Sie den folgenden VBA-Code und fügen Sie ihn unterhalb des vorhandenen Codes im frmMenu ein Formularmodul und speichern Sie das Formular.
Private Sub cmdExpand_Click()Dim Nodexp As MSComctlLib.NodeFor Each Nodexp In tv.Nodes Wenn Nodexp.Expanded =False Then Nodexp.Expanded =True End IfNext NodexpEnd SubPrivate Sub cmdCollapse_Click()Dim Nodexp As MSComctlLib.NodeFor Each Nodexp In tv .Nodes Wenn Nodexp.Expanded =True Then Nodexp.Expanded =False End IfNext NodexpEnd Sub

Am Anfang des cmdExpand_Click() Event haben wir ein Tree View Node-Objekt NodExp deklariert. Das Für . . . Weiter Schleife nimmt jeweils einen Knoten und prüft, ob er in erweiterter Form vorliegt oder nicht. Wenn nicht, dann ist es Erweitert Eigenschaftswert wird auf True gesetzt .

Ebenso die cmdCollapse_Click() Das Ereignis führt eine ähnliche Prüfung durch, und wenn es sich in einem erweiterten Zustand befindet, wird der Wert der erweiterten Eigenschaft auf „Falsch“ gesetzt.

Alle Knoten der vollständigen Baumansichtssteuerung können erweitert werden und machen alle untergeordneten Knoten gleichzeitig sichtbar oder alle untergeordneten Knoten bleiben verborgen, mit Ausnahme der Knoten auf Stammebene.

Ich hoffe, es hat Ihnen Spaß gemacht, das neue Menü für Ihr Projekt zu erstellen. Wenn Sie die Designaufgabe Schritt für Schritt durchgehen, sollte Ihr Menü wie das fertige Menübild oben aussehen.

Im Jahr 2007 habe ich in einem meiner Projekte ein Menü für das Fahrzeugservicevertragssystem entworfen, das die Registerkartensteuerung mit mehreren Seiten verwendet. Jede Seite hat 10 oder mehr Optionen und lässt jede Seite abwechselnd im selben Bereich erscheinen, wenn der Benutzer auf die Befehlsschaltflächen klickt, die auf beiden Seiten des Menüs aufgereiht sind. Die Befehlsschaltflächen auf der rechten Seite ändern sich ebenfalls, basierend auf der Auswahl von die linke Schaltfläche.

Zum Vergrößern klicken

Den Artikel Menüdesign mit Registerkartensteuerung finden Sie unter diesem Link:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html


KLASSENMODUL

  1. MS-Access-Klassenmodul und VBA
  2. MS-Access-VBA-Klassenobjekt und -Arrays
  3. MS-Access-Basisklasse und abgeleitete Objekte
  4. VBA-Basisklasse und abgeleitetes Objekt-2
  5. Basisklasse und abgeleitete Objektvarianten
  6. MS-Access Recordset und Klassenmodul
  7. Zugriff auf Klassenmodul und Wrapper-Klassen
  8. Wrapper-Klassenfunktionalität