sql >> Database >  >> RDS >> Access

Toegangsmenu maken met Tree View Control

Het Microsoft Access Project-menu, wanneer u klaar bent met de Tree View-besturing, ziet er uit als de onderstaande afbeelding.

De afbeelding hierboven toont de derde optie van de rapportgroep Aangepast rapport is geselecteerd en gemarkeerd, met het Rapportfilterparameterformulier open, overlappend met het menuscherm, voor invoer door de gebruiker.

Voordat we daarop ingaan, hebben we in de les van vorige week geleerd hoe we de gerelateerde items in hiërarchische volgorde kunnen ordenen, met behulp van Microsoft Tree View Control, op basis van het Voorbeeld data tafel.

Ik heb vorige week een punt gemaakt dat de gerelateerde items in de gegevens van Tree View-besturingselement niet noodzakelijk naast elkaar hoeven te staan. Hierna zult u meer duidelijkheid hebben over het bijwerken van Relative Sleutels van onderliggende knooppunten, ongeacht de fysieke positie van de records in de tabel, maar gebaseerd op de relatie met de bovenliggende knooppunt-ID's.

Dit was de gegevenstabel die we hebben gebruikt en die we hebben afgesloten met de oefening van vorige week:

Kunt u de volgende lijst met items aan het einde van de bovenstaande tabel toevoegen en hun ParentID-veldwaarden bijwerken zodat de TreeView-weergave eruitziet als de onderstaande voorbeeldafbeelding:

Nieuwe records voor Tabel itemrecord gerelateerd veld :

  1. Tekstveld.
  2. Nummerveld.
  3. Datum-/tijdveld.
  4. Hyperlinkveld.

Formulier gerelateerde besturingselementen:

  1. Tekstvak.
  2. Opdrachtknoppen.
  3. Combobox.
  4. Lijstvenster.

Melden gerelateerde besturingselementen:

  1. Tekstvak.
  2. Label.
  3. Grafiekdiagram.

Wijs ParentID-waarden toe aan deze items zodat de Tree View-weergave er als volgt uitziet:

Nu gaan we verder met het maken van een MS-Access-projectmenu en leren we wat er nodig is om er een te maken. Hieronder ziet u een eenvoudig menubeeld:


Het is een eenvoudig menu met slechts drie groepen opties:Formulieren, Rapportweergaven en Macro's.

Onder Formulieren Groep twee opties worden gegeven, de eerste toont de Tree View controls Menu tabel record. De tweede optie geeft dezelfde records weer in kettingformuliermodus.

De eerste optie onder Rapportweergave geeft een rapport weer over producten Categorie records, uit de categorieëntabel van NorthWind.accdb database.

De tweede optie geeft het productlijstprijsrapport weer.

De derde optie opent een Parameter Formulier zodat de gebruiker de Min . kan instellen imum en Max imum lijst-prijs waarden bereik, om gegevens te filteren voor het product lijst-prijs rapport.

Onder de Macroprocessen Groep, beide opties draaien Macro1 en Macro2 respectievelijk en verschillende berichten weergeven.

We hebben een menutabel nodig met de bovenstaande optierecords met enkele extra velden, naast de gebruikelijke gegevensvelden voor unieke ID's, beschrijvingen en ouder-ID's van TreeView. De afbeelding van de menutabel wordt hieronder weergegeven:

Maak een tabel met de bovenstaande structuur, voeg de bovenstaande records toe en sla deze op met de naam Menu . De ID veld is AutoNummering, PID, en Type velden zijn numerieke velden, andere zijn tekstvelden.

We zijn bekend met de eerste drie gegevensvelden:de unieke ID , Beschrijving, en de Ouder-ID velden. Hier heb ik de veldnaam ParentID ingekort tot PID .

We hebben nog vier velden nodig in de menutabel, één veld Type voor het objecttype Code, en drie velden Formulier , Melden, en macro .

Type Veld bevat de numerieke codes van het toegangsobjecttype om de optie te identificeren waarop de gebruiker heeft geklikt.

  • Het formulierveld is voor formuliernamen, object Type code 1,
  • Rapportveld bevat Rapportnamen, object Type code 2,
  • Macroveld is voor Macronamen, objecttypecode 3.

Opmerking: Alle objectnamen kunnen in één kolom worden geplaatst. We hebben alleen voor de duidelijkheid aparte velden gebruikt. Als je dat doet, breng dan wijzigingen aan in de VBA-code, waar deze ook verwijst naar verschillende veldnamen.

Op basis van de codenummers kunnen we de objectnamen ophalen uit hun respectievelijke velden en het DoCmd.Openform aanroepen of Docmd.OpenReport of Docmd.RunMacro om de actie op de onderliggende node-klikken uit te voeren.

Nu moeten we de typecode en objectnaam op de onderliggende knooppunten opslaan. We zullen dat onderwerp behandelen wanneer we beginnen met het toevoegen van de knooppunten aan de structuurweergave.

We hebben nog twee gegevenstabellen nodig voor voorbeeldformulieren en -rapporten. De Categorieën Tafel en Producten Tabellen, van de NorthWind.accdb voorbeelddatabase. Om je tijd te besparen heb ik de demodatabase met alle objecten en programma's aan het einde van deze pagina toegevoegd om te downloaden en uit te proberen.

Maak twee formulieren met behulp van de menutabel met de namen Gegevensinvoer en een ander formulier Gegevensweergave in continu Formuliermodus.

Maak twee rapporten, één in de categorietabel met de rapportnaam:Categorieën, een ander rapport over de productentabel met de naam Productlijst . Een lang Label toevoegen controle onder de hoofdkop in het productlijstrapport en verander de naam eigenschap waarde in Bereik .

Maak een klein formulier met twee ongebonden tekstvakken en verander hun naam Eigenschapswaarde in Min &Max, zoals het onderstaande ontwerp:

Voeg twee opdrachtknoppen toe zoals hierboven weergegeven. Verander het Bijschrift Eigenschapswaarde van de eerste knop om Report openen t en de Naam Eigenschapswaarde naar cmdReport .

Wijzig het bijschrift van de tweede opdrachtknop in Annuleren en de Naam Eigenschapswaarde naar cmdCancel .

Geef de codemodule van het formulier weer. Kopieer en plak de volgende code in de formuliermodule en sla het formulier op:

Private Sub cmdOpen_Click()
Dim mn, mx, fltr As String
mn = Nz(Me![Min], 0)
mx = Nz(Me![Max], 9999)
If (mn + mx) > 0 Then
    fltr = "[List Price] > " & mn & " And " & "[List Price] <= " & mx
    DoCmd.OpenReport "Products Listing", acViewReport, , fltr, , fltr
Else
    DoCmd.OpenReport "Products Listing", acViewReport
End If

End Sub

Private Sub cmdCancel_Click()
DoCmd.Close
End Sub

Wanneer de gebruiker een waardebereik instelt door het minimum en maximum prijsbereik in te voeren in hun respectievelijke tekstvakken, wordt de tekenreeks voor rapportfiltercriteria gemaakt. Het Rapportfilter Tekenreekswaarde wordt doorgegeven aan de Productvermelding Rapporteren als Open Rapport-opdracht Parameter. De waarde van de filterreeks wordt ook doorgegeven als de OpenArgs (Open argument) Parameter.

De parameter Filter filtert de rapportgegevens, gebaseerd op de criteria, opgegeven in de velden Min &Max, en de waarde van het open argument wordt gekopieerd naar het Bereik Label Bijschrift wanneer het rapport is geopend.

Kopieer en plak de volgende code in de Productvermelding VBA-module van het rapport:

Private Sub Report_Open(Cancel As Integer)
    DoCmd.Close acForm, "Parameter"
    Me.Range.Caption = Nz(Me.OpenArgs, "")
End Sub
  1. Maak een nieuw formulier aan, met de naam frmMenu, en voeg het Microsoft TreeView-besturingselement . toe uit de lijst van het Activex-besturingselement. Wijzig het formaat van het besturingselement zoals weergegeven in de ontwerpweergave hieronder:

  2. Wijzig de naam van het Tree View-besturingselement in TreeView0 in het normale eigenschappenblad.

  3. Voeg een opdrachtknop toe onder het besturingselement Tree View. Wijzig de Naam Eigenschapswaarde tot cmdExit en Bijschrift Eigenschapswaarde tot Verlaten .

  4. Klik met de rechtermuisknop op de structuurweergave en markeer het TreeCtrl_Object optie en selecteer Eigenschappen om het eigenschappenblad weer te geven.

  5. Wijzig de volgende eigenschapswaarden zoals hieronder aangegeven:

  • Stijl =7 (tvwTreeLinesPlusMinusPictureText)
  • Lijnstijl =1 (tvwRootLines)
  • LabelEdit =1 (tvwManual)

Afgelopen week hebben we de eerste twee Woningwaarden gewijzigd. Wanneer LabelEdit De standaardwaarde van de eigenschap is 0 - tvwAutomatisch, Door twee keer op de Node te klikken (niet dubbelklikken) gaat de Node-Text naar de Edit Mode en kun je de tekst wijzigen. Maar het zal het gegevensbronveld niet rechtstreeks bijwerken. Door het te veranderen in 1 – tvwManual voorkomt dat het in de bewerkingsmodus gaat.

We kunnen dit veranderen via Code door de volgende regels toe te voegen in de Form_Load() Event Procedure:

With Me.TreeView0.Object
    .Style = tvwTreelinesPlusMinusPictureText
    .LineStyle = tvwRootLines	
    .LabelEdit = tvwManual
End With

Vorige week hebben we de Form_Load() . gebruikt Gebeurtenis Procedure om de waarden van de structuurweergaveknooppunten te lezen om de hoofdknooppunten en onderliggende knooppunten te maken. We hebben dezelfde procedure hier ook nodig met een paar regels extra code.

Daarnaast moeten we de Node_Click() . vangen Event of Nodes om te controleren welke optie de gebruiker heeft geselecteerd.

Kopieer en plak de volgende VBA-code in de formuliermodule en sla het formulier op.

Option Compare Database Option Explicit Dim tv As MSComctlLib.TreeView Const KeyPrfx As String = "X" Private Sub Form_Load() Dim db As Database Dim rst As Recordset Dim nodKey As String Dim PKey As String Dim strText As String Dim strSQL As String Dim tmpNod As MSComctlLib.Node Dim Typ As Variant Set tv = Me.TreeView0.Object tv.Nodes.Clear

‘Change the TreeView Control Properties

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

strSQL = "SELECT ID, Desc, PID, Type,Macro,Form,Report FROM Menu;" Set db = CurrentDb Set 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) 'Root-Level Node Description in Bold letters With 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) 'Check for the presense of Type Code If 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 Case 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.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub Private Sub cmdExit_Click() If MsgBox("Close Menu Form? ", vbYesNo, "cmdExit_Click()") = vbYes Then DoCmd.Close End If End Sub Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If

‘Reset the earlier lighlight to normal

For Each nodOn In tv.Nodes
    nodOn.BackColor = vbWhite
    nodOn.ForeColor = vbBlack
Next

‘changes BackColor to light Blue and ForeColor White

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

‘—Highlight code ends-

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

Op het globale declaratiegebied van de module wordt het Tree View-object gedeclareerd. Een constante variabele KeyPrfx wordt gedeclareerd met de waarde "X".

De Form_Load() Evenementprocedure van het artikel van vorige week hebben we gewijzigd met een aanvullende code. Ik heb commentaar gegeven op het nieuwe Code-segment om een ​​indicatie te geven van wat het doet, maar ik zal uitleggen wat het doet.

De procedure declareert Database, Recordset en vier String-variabelen. De volgende twee regels declareren een tijdelijk knooppuntobject:tmpNod en Typ Variantvariabelen worden gedeclareerd.

Vervolgens het TreeView-object tv is toegewezen aan de TreeView0 Bezwaar op het formulier. De bestaande Nodes van TreeView0, indien aanwezig, worden gewist met de instructie:tv.Nodes.Clear , ter voorbereiding op het opnieuw laden van alle Nodes.

We hebben de volgende code geïmplementeerd om de eigenschappen van het Tree View-besturingselement te wijzigen via code, in plaats van via het eigenschappenblad.

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

Het Tree View-lettertype is gewijzigd in Verdana. Daarnaast zullen we wat meer functies toevoegen, zoals het uitvouwen of samenvouwen van alle menugroepen met één klik, in plaats van handmatig de ene groep na de andere uit te vouwen of samen te vouwen.

De nieuwe SQL-tekenreeks is gewijzigd om de nieuwe velden Type, Formulier, Rapport en Macrovelden toe te voegen vanuit de menutabel.

Het eerste record van de menutabel wordt gecontroleerd op de aanwezigheid van een waarde in de PID veld, als het leeg is, is het een Node-record op rootniveau. Het wordt toegevoegd aan het Tree View-object als het knooppunt op rootniveau en de verwijzing wordt opgeslagen in de tmpNod Voorwerp.

De Node heeft verschillende eigenschappen zoals Voorkleur, Vet, en een aantal andere daarvan hebben we de Bold . genomen Eigendom en toegewezen True om het Rootniveau . te maken Het knooppunt ziet er anders uit dan de onderliggende knooppunten.

Als het geen Root Node-item is, heeft het de PID-waarde, het programma neemt de Else clausule en het record wordt toegevoegd als een onderliggend knooppunt. Hier controleren we het Type veld waarde. Als het een van de drie waarden 1, 2, . bevat of 3 dan moeten we de waarde uit Formulier, Rapport of Macronaam nemen samen met de Typecode en ze samenvoegen (zoals ”1Data Entry” , "2Categorie-vermelding" etc.) en sla het op in de Tag Eigenschap van onderliggende knooppunten. We zijn bekend met de tag-eigenschap in toegangscontroles, zoals tekstvakken, labels, opdrachtknoppen en andere, maar we gebruiken het zelden.

De cmdExit_Click() Procedure sluit het menuformulier als het antwoord van de gebruiker bevestigend is.

Wanneer de gebruiker op een onderliggende node klikt, wordt de waarde die we hebben opgeslagen in de Tag Eigendom moet worden geëxtraheerd en gecontroleerd om te bepalen wat er vervolgens moet gebeuren. Hiervoor hebben we een TreeView0_NodeClick() . nodig Evenement Procedure.

Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If

‘Reset the earlier lighlight to normal

For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn

‘changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends- varTag = Nz(Node.Tag, "") If Len(varTag) > 0 Then typeid = Val(varTag) objName = Mid(varTag, 2) End If Select Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Case 3 DoCmd.RunMacro objName End Select End Sub

De Click() Event Procedure ontvangt de aangeklikte Node's Reference als een parameter in het object Knooppunt . Aan het begin van deze procedure hebben we enkele variabelen gedeclareerd.

De volgende paar regels controleren of het aangeklikte knooppunt zich in een uitgevouwen of samengevouwen toestand bevindt.

Normaal gesproken, om een ​​knooppunt uit te vouwen, om de verborgen onderliggende knooppunten te tonen, klikken we op de + (plus symbool) aan de linkerkant van een Node of dubbelklik op de Node zelf. Als u nogmaals op het knooppunt dubbelklikt of op het – (minteken) klikt, worden de onderliggende knooppunten verborgen.

Met het volgende codesegment kunnen we onderliggende knooppunten met een enkele klik uitvouwen of samenvouwen:

If Node.Expanded = False Then
    Node.Expanded = True
Else
    Node.Expanded = False
End If 

De volgende zes uitvoerbare regels zorgen ervoor dat het knooppunt dat de klik heeft ontvangen, gemarkeerd blijft.

‘Reset the earlier Highlight to Normal

For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn

‘Changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends-

Vervolgens wordt de Tag Property-waarde ingelezen in de varTag Variabel. Als het niet leeg is, wordt de waarde in twee delen gesplitst. De numerieke waarde wordt geëxtraheerd en opgeslagen in de Typid variabele en het gedeelte Objectnaam wordt opgeslagen in variabele objName .

Afhankelijk van de waarde in de Typid-variabele is de Docmd wordt uitgevoerd om het formulier, het rapport of de macro te openen.

We zullen nog twee opdrachtknoppen bovenaan het menu toevoegen. Een om alle knooppunten uit te vouwen met één klik en de tweede om alle knooppunten samen te vouwen.

  1. Voeg nog twee opdrachtknoppen toe in het bovenste gedeelte van de structuurweergave, zoals weergegeven op het onderstaande ontwerp.
  2. Wijzig de Naam Eigenschapswaarde van de linker opdrachtknop voor cmdExpand en het Bijschrift om Alles uit te vouwen .
  3. Verander op dezelfde manier de Naam . van de rechter Command Button Eigenschap naar cmdCollapse en het Bijschrift om Alles samen te vouwen.
  4. Kopieer en plak de volgende VBA-code onder de bestaande code in het frmMenu Formuliermodule en sla het formulier op.
Private Sub cmdExpand_Click()
Dim Nodexp As MSComctlLib.Node

For Each Nodexp In tv.Nodes
    If Nodexp.Expanded = False Then
        Nodexp.Expanded = True
    End If
Next Nodexp
End Sub


Private Sub cmdCollapse_Click()
Dim Nodexp As MSComctlLib.Node

For Each Nodexp In tv.Nodes
    If Nodexp.Expanded = True Then
        Nodexp.Expanded = False
    End If
Next Nodexp
End Sub

Aan het begin van de cmdExpand_Click() Event, we hebben een Tree View Node-object NodExp. De Voor . . . Volgende loop neemt één Node per keer en controleert of deze in uitgebreide vorm is of niet. Zo niet, dan is het Uitgebreid Eigenschapswaarde is ingesteld op True .

Evenzo, de cmdCollapse_Click() Event voert een vergelijkbare controle uit en als het in een uitgevouwen staat is, wordt de waarde van de uitgebreide eigenschap ingesteld op False.

Alle knooppunten van de volledige structuurweergave kunnen worden uitgebreid en maken al hun onderliggende knooppunten tegelijk zichtbaar of alle onderliggende knooppunten blijven verborgen behalve de knooppunten op rootniveau.

Ik hoop dat je het leuk vond om het nieuwe menu voor je project te maken. Als u de ontwerptaak ​​stap voor stap doorloopt, zou uw menu eruit moeten zien als de voltooide menuafbeelding bovenaan.

Gedurende het jaar 2007 heb ik een menu ontworpen in een van mijn projecten, voor het voertuigservicecontractsysteem, met behulp van de tabbesturing met meerdere pagina's. Elke pagina heeft 10 of meer opties en om elke pagina om de beurt in hetzelfde gebied te laten verschijnen wanneer de gebruiker op de opdrachtknoppen aan weerszijden van het menu klikt. De opdrachtknoppen aan de rechterkant veranderen ook, op basis van de selectie van de linker zijknop.

Klik om te vergroten

U kunt het artikel over menuontwerp met tabbladbeheer vinden op deze link:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html


KLASSEMODULE

  1. MS-Access Class-module en VBA
  2. MS-Access VBA-klassenobject en arrays
  3. MS-Access-basisklasse en afgeleide objecten
  4. VBA-basisklasse en afgeleid object-2
  5. Basisklasse en afgeleide objectvarianten
  6. MS-Access-recordset en klassenmodule
  7. Toegang tot klassenmodule en wrapperklassen
  8. Wrapper Class-functionaliteit


  1. Converteer efficiënt rijen naar kolommen in de sql-server

  2. Bibliotheek niet geladen:libmysqlclient.16.dylib-fout bij het uitvoeren van 'rails server' op OS X 10.6 met mysql2 gem

  3. Variabele declareren in PostgreSQL

  4. Hoe kom ik erachter of een Oracle-database is ingesteld op autocommit?