TreeView aufgebohrt

Kontextmenü im TreeView aufrufen

Die Menüstruktur steht, allein der Aufruf fehlt. Hier kommen nun die Ereignisse des TreeView- Steuerelements ins Spiel. Welche das sind, offenbart ein Blick in den Objektkatalog (Bild 4).

Bild 4: Der Objektkatalog bietet einen Überblick über die Ereigniseigenschaft en des TreeView- Steuerelements.
Bild 4: Der Objektkatalog bietet einen Überblick über die Ereigniseigenschaft en des TreeView- Steuerelements.

Anlegen lassen sich die passenden Ereignisprozeduren am einfachsten, indem Sie im Codefenster im linken Kombinationsfeld das TreeView- Steuerelement und im rechten Kombinationsfeld das gewünschte Ereignis auswählen.

Welche Ereigniseigenschaft ist in diesem Fall die richtige? Klar, dass es etwas mit einem Mausklick zu tun hat, aber dazu bietet das TreeView- Steuerelement eine ganze Reihe von Ereignissen. Was passiert denn genau beim Auswählen eines Kontextmenüeintrags? Der Benutzer drückt die rechte Maustaste, wählt einen Eintrag des Kontextmenüs aus und lässt die rechte Maustaste wieder los. Und das ist der Knackpunkt: Erst beim Loslassen steht fest, welchen Eintrag der Benutzer ausgewählt hat. Die Wahl des richtigen Ereignisses fällt nun leicht: MouseUp ist Ihr Kandidat.

Legen Sie also das Gerüst der passenden Ereigniseigenschaft an und ergänzen Sie es um die fehlenden Codezeilen. Den Code finden Sie in Listing 2, die Erläuterungen im Folgenden:

Private Sub ctlTreeView_MouseUp(ByVal Button As Integer, ByVal Shift As Integer,
ByVal x As Long, ByVal y As Long)
Dim cbr As Office.CommandBar
Dim objNode As MSComctlLib.Node
Dim strType As String
Dim lngID As Long
If Button = 2 Then
If ctlTreeView.HitTest(x, y) Is Nothing Then
'leerer Bereich getroffen
Set cbr = CommandBars("TreeView_KeinEintrag")
Else
'Node getroffen
Set objNode = ctlTreeView.HitTest(x, y)
strType = Left(objNode.Key, 3)
lngID = Mid(objNode.Key, 4)
If strType = "kat" Then
'Kategorie-Knoten
Set cbr = CommandBars("TreeView_Kategorien")
cbr.Controls("Kategorie bearbeiten").OnAction = "=mnuKategorieBearbeiten("
& lngID & ")"
cbr.Controls("Kategorie löschen").OnAction = "=mnuKategorieLoeschen("
& lngID & ")"
cbr.Controls("Neuer Artikel").OnAction = "=mnuNeuerArtikel(" &
lngID & ")"
ElseIf strType = "art" Then
'Artikel-Knoten
Set cbr = CommandBars("TreeView_Artikel")
cbr.Controls("Artikel bearbeiten").OnAction = "=mnuArtikelBearbeiten("
& lngID & ")"
cbr.Controls("Artikel löschen").OnAction = "=mnuArtikelLoeschen(" &
lngID & ")"
End If
End If
If Not cbr Is Nothing Then
cbr.ShowPopup
End If
End If

Option Compare Database
Option Explicit
Public Function mnuNeueKategorie()
Dim strKategorie As String
Dim lngKategorieID As Long
DoCmd.OpenForm "frmKategorien", DataMode:=acFormAdd, WindowMode:=acDialog
If IstFormularGeoeffnet("frmKategorien") Then
strKategorie = Forms!frmKategorien!Kategoriename
lngKategorieID = Nz(Forms!frmKategorien![Kategorie-Nr], 0)
If Not lngKategorieID = 0 Then
Forms!frmTreeviewMitKontextmenue.ctlTreeView.Nodes.Add , , "kat" &
lngKategorieID, strKategorie
DoCmd.Close acForm, "frmKategorien"
End If
End If
End Function
Public Function mnuKategorieBearbeiten(lngKategorieID As Long)
Dim strKategorie As String
DoCmd.OpenForm "frmKategorien", DataMode:=acFormEdit, WindowMode:=acDialog,
WhereCondition:="[Kategorie-Nr] = " & lngKategorieID
If IstFormularGeoeffnet("frmKategorien") Then
strKategorie = Forms!frmKategorien!Kategoriename
Forms!frmTreeviewMitKontextmenue.ctlTreeView.Nodes("kat" & lngKategorieID).
Text = strKategorie
DoCmd.Close acForm, "frmKategorien"
End If
End Function
Public Function mnuKategorieLoeschen(lngKategorieID As Long)
CurrentDb.Execute "DELETE FROM Kategorien WHERE [Kategorie-Nr] = " & lngKategorieID,
dbFailOnError
Forms!frmTreeviewMitKontextmenue.ctlTreeView.Nodes.Remove "kat" & lngKategorieID
End Function
Public Function mnuArtikelBearbeiten(lngArtikelID As Long)
Dim strArtikel As String
DoCmd.OpenForm "frmArtikel", DataMode:=acFormEdit, WindowMode:=acDialog, Where-
Condition:="[Artikel-Nr] = " & lngArtikelID
If IstFormularGeoeffnet("frmArtikel") Then
strArtikel = Forms!frmArtikel!Artikelname
Forms!frmTreeviewMitKontextmenue.ctlTreeView.Nodes("art" &
lngArtikelID).Text = strArtikel
DoCmd.Close acForm, "frmArtikel"
End If
End Function
Public Function mnuArtikelLoeschen(lngArtikelID As Long)
CurrentDb.Execute "DELETE FROM Artikel WHERE [Artikel-Nr] = " & lngArtikelID,
dbFailOnError
Forms!frmTreeviewMitKontextmenue.ctlTreeView.Nodes.Remove "art" & lngArtikelID
End Function
Public Function mnuNeuerArtikel(lngKategorieID As Long)
Dim lngArtikelID As Long
Dim strArtikel As String
Dim objNode As MSComctlLib.Node
DoCmd.OpenForm "frmArtikel", DataMode:=acFormAdd, WindowMode:=acDialog, OpenArgs:=
lngKategorieID
If IstFormularGeoeffnet("frmArtikel") Then
lngArtikelID = Nz(Forms!frmArtikel![Artikel-Nr], 0)
If lngArtikelID > 0 Then
strArtikel = Forms!frmArtikel!Artikelname
lngKategorieID = Forms!frmArtikel![Kategorie-Nr]
Set objNode = Forms!frmTreeviewMitKontextmenue.ctlTreeView.Nodes("kat"
& lngKategorieID)
Forms!frmTreeviewMitKontextmenue.ctlTreeView.Nodes.Add objNode, tvw-
Child, "art" & lngArtikelID, strArtikel
DoCmd.Close acForm, "frmArtikel"
End If
End If
End Function