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

Baumansichtssteuerung Häkchen hinzufügen Knoten löschen

Einführung.

In dieser Folge des Tutorials zur Steuerung der Baumansicht lernen wir, wie man hinzufügt/löscht Knoten. Die Position des Add/Delete-Kandidatenelements wird markiert, wo wir Hinzufügen() möchten den neuen Knoten oder auf Remove() der markierte Knoten. Das Hinzufügen des Knotens kann auf der gleichen Ebene wie der markierte Knoten oder als untergeordneter Knoten erfolgen.

Die bisherigen Tutorial-Sitzungen zum TreeView-Steuerelement.

  1. Tutorial für das Microsoft TreeView-Steuerelement
  2. Zugriffsmenü mit TreeView-Steuerelement erstellen
  3. Bilder dem TreeView-Steuerelement zuweisen
  4. Zuweisen von Bildern zu TreeView Control-2

Die normale Ansicht des Demo-Strukturansicht-Steuerelements auf dem MS-Access-Formular mit anderen Steuerelementen ist unten angegeben.

Die Datentabelle für die Demo des TreeView-Steuerelements.

Die Tabelle mit dem Namen Beispiel die wir in der ersten Tutorial-Session verwendet haben, werden wir auch hier verwenden. Es handelt sich um eine kleine Tabelle mit Aufzeichnungen der Access-Datenbank, Tabellen, Formular- und Berichtssteuerelementen, die in hierarchischer Reihenfolge angeordnet und leicht verständlich sind.

Die ID Spalte (Baumansicht Schlüssel ) ist ein AutoWert-Feld.

Neue Besucher werden über diese Tutorial-Sitzung informiert.

Wenn Sie die erste Tutorial-Sitzung noch nicht absolviert haben, können Sie die Demo-Datenbank von der zweiten Sitzungsseite herunterladen:Zugriffsmenü mit Baumansichtssteuerung erstellen. In dieser Datenbank gibt es eine Tabelle mit dem Namen:Sample und Formular frmSample . Sie können sie in Ihre aktuelle Datenbank importieren. Es gibt ein weiteres Formular mit dem Namen frmMenu dort hinein und Sie können die Befehlsschaltflächen Alle erweitern kopieren Alle minimieren und ihre Befehlsschaltflächen-Klickereignisprozeduren aus frmMenu zum frmSample Codemodul, um mit dieser Sitzung fortzufahren.

Wie ich bereits erwähnt habe, können wir das ImageList-Steuerelement mit den hochgeladenen Bildern für andere Projekte freigeben. Wir werden eine Kopie des ImageList-Steuerelements der letzten Tutorial-Sitzung erstellen und es mit allen hochgeladenen Bildern hierher bringen und für das verwenden Baumansicht-Kontrollknoten auf frmSample .

ImageList-Steuerelement mit Bildern importieren.

Sie können das ImageList Control, das Sie bereits haben, mit hochgeladenen Bildern in einer anderen Datenbank wie folgt einbringen:

  1. Importieren Sie das Formular mit dem ImageList-Steuerelement in die aktive Datenbank aus der Datenbank, in der sich das ImageList-Steuerelement mit manuell hochgeladenen Bildern befindet. Kopieren Sie das ImageList-Steuerelement und fügen Sie es an der gewünschten Stelle in das Formular ein.

  2. Oder kopieren Sie zuerst das ImageList-Steuerelement aus der Datenbank, in der Sie es haben, in die Zwischenablage. Wenn Sie die Demo-Datenbank aus der früheren Tutorial-Sitzung heruntergeladen haben, verfügen Sie bereits über das ImageList Control mit hochgeladenen Bildern. Schließen Sie die Datenbank, nachdem Sie das ImageList-Steuerelement in die Zwischenablage kopiert haben.

  3. Öffnen Sie die Zieldatenbank und öffnen Sie das Formular an der Stelle, an der Sie das ImageList-Steuerelement haben möchten, und fügen Sie es in das Formular ein.

    Mit den folgenden Codezeilen im CreateTreeView() Unterroutine können Sie die ImageList-Objektreferenz an das Baumansichtssteuerelement übergeben.

    Dim tv As MSComctlLib.TreeView
    Dim ImgList As MSComctlLib.ImageList
    
    Set tv = Me.TreeView0.Object
    tv.Nodes.Clear
    
    Set ImgList = Me.ImageList0.Object
    tv.ImageList = ImgList 

Ändern Sie die hervorgehobenen Objektnamen im Code, wenn sie sich auf dem Formular unterscheiden.

Danach können Sie die Bildschlüsselnamen in die TreeView Nodes.Add() einfügen die letzten beiden Parameter der Methode.

Diese Übungen haben wir bereits in den früheren Sitzungen gemacht. Zur Erinnerung:Wir verwenden das Tabellen- und Baumansichts-Steuerelement, das wir in der ersten Tutorial-Sitzung erstellt und mit den oben erläuterten Änderungen implementiert haben.

Anzeige der Eigenschaftswerte der markierten Knoten.

Der ausgewählte Knotenschlüssel , Übergeordneter Schlüssel, und Text Eigenschaften werden in den TextBoxes auf der rechten Seite des Tree View Control angezeigt. Die Check-Box mit der Beschriftung:Untergeordneter Knoten, das Löschen Knoten, und Knoten hinzufügen Befehlsschaltflächen sind neue Ergänzungen zum Formular. Ihre Funktionen werden gleich erklärt.

Anzeigen von Kontrollkästchen im TreeView-Steuerelement.

Normalerweise wird das Kontrollkästchen nicht im TreeView-Steuerelement angezeigt, es sei denn, wir aktivieren eine Eigenschaft im Eigenschaftenblatt des TreeView-Steuerelements. Es hat hier nur eine eingeschränkte Funktionalität. Was auch immer wir hier tun werden, kann auch ohne das Kontrollkästchen durchgeführt werden.

Ein besserer Ansatz für die Verwendung von CheckBoxen kann die Erstellung eines Berichts über ausgewählte Niederlassungsstandorte der Unternehmen des Unternehmens sein, basierend auf einer zufälligen Auswahl von Niederlassungen durch den Benutzer aus dem Access-Projektmenü.

Hier ist das Ziel, ein Bewusstsein für diese Funktion zu schaffen und eine Demo zu ihrer Verwendung durchzuführen.

  1. Öffnen Sie das Formular mit dem TreeView-Steuerelement in der Entwurfsansicht.
  2. Klicken Sie mit der rechten Maustaste auf das TreeView-Steuerelement, markieren Sie das TreeCtrl-Objekt , wählen Sie die Eigenschaften aus Option zum Anzeigen des Eigenschaftsblatts.
  3. Setzen Sie ein Häkchen auf die CheckBoxes Option auf der Eigenschaftensteuerung, wie in der Abbildung unten gezeigt.

Das oben angezeigte Demo-TreeView-Bild, Details.

Lassen Sie uns sehen, was wir auf dem Demo-Formular frmSample haben oben auf dieser Seite dargestellt. Die Baumansichtssteuerung und die oberen beiden Befehlsschaltflächen, Alle erweitern und Alle minimieren Ein Klick erweitert oder reduziert die Knoten und wir haben ihre Funktionen in der letzten Episode gesehen.

Auf der rechten Seite befinden sich drei TextBoxen, unter der Überschrift Label:Property Values , um den Schlüssel des markierten Knotens anzuzeigen , Elternschlüssel, und Text Werte.

Der Knoten löschen Die Befehlsschaltfläche entfernt den mit einem Häkchen markierten Knoten oder den Knoten und seine untergeordneten Knoten.

Vor dem Auswählen der Befehlsschaltfläche Knoten hinzufügen , der Text Der Eigenschaftswert muss bearbeitet werden, um ihn durch den neuen Textwert für den neuen Knoten zu ersetzen.

Über dem Knoten hinzufügen Befehlsschaltfläche befindet sich ein Kontrollkästchen mit dem Label Child Node. Der Hinzufügen-Knoten und Untergeordneter Knoten Check-Box arbeiten zusammen, um die Regel festzulegen, wo der neue Knoten erscheinen soll.

Die Aktion "Knoten hinzufügen" verstehen.

Angenommen, Sie möchten einen neuen Knoten für Hyperlink hinzufügen Feld unter Felder Gruppe (oder übergeordneter Knoten) Datentyp Liste. Sehen Sie sich das Demo-Bild oben auf dieser Seite an, wo ich das Datumsfeld markiert habe Node, neben anderen Child-Nodes. Die Eigenschaftsblätter auf der rechten Seite zeigen den Schlüssel:X15 , ParentKey:X4 &Text:Datumsfeld Beschreibung.

Ändern Sie den Text:Datumsfeld zu Hyperlink im Textfeld Eigenschaftsanzeige und klicken Sie auf Knoten hinzufügen Befehlsschaltfläche. Die Ausgabe sieht wie folgt aus:

Wenn Sie die Felder markieren Element des übergeordneten Knotens und markieren Sie den Kind-Knoten Option über dem Knoten hinzufügen Befehlsschaltfläche erhalten Sie das gleiche Ergebnis.

Stattdessen, wenn Sie das Knoten-Häkchen auf dem Datumsfeld lassen und setzen Sie den Haken beim Child-Node Option über dem Knoten hinzufügen Befehlsschaltfläche erhalten Sie das unten gezeigte Ergebnis.

Der untergeordnete Knoten wird unter dem markierten Knoten erstellt.

Die Aktionen zum Hinzufügen von Knoten müssen zuerst einen neuen Datensatz in der zugrunde liegenden Tabelle erstellen.

Im Beispiel wird ein neuer Datensatz erstellt Tabelle, mit dem neuen Text:HyperLink und Eltern-ID Werte. Das AutoNumber-Feld generiert eine neue Zahl, die wir abrufen und als Schlüsselwert für den Knoten verwenden.

Der Sub-Routine-VBA-Code zum Hinzufügen von Knoten ist unten angegeben:

Private Sub cmdAdd_Click()
Dim strKey As String
Dim lngKey As Long
Dim strParentKey As String
Dim lngParentkey As Long
Dim strText As String
Dim lngID As Long
Dim strIDKey As String

Dim childflag As Integer
Dim db As DAO.Database
Dim strSql As String
Dim intflag As Integer
Dim tmpnode As MSComctlLib.Node

Dim i As Integer
i = 0
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
       tmpnode.Selected = True
        i = i + 1
    End If
Next
If i > 1 Then
      MsgBox "Selected Nodes: " & i & vbCr & "Select only One Node to mark Addition.", vbCritical, "cmdAdd()"
    Exit Sub
End If

'Read Property Values from Form
strKey = Trim(Me![TxtKey])
lngKey = Val(Mid(strKey, 2))

strParentKey = Trim(Me![TxtParent])
lngParentkey = IIf(Len(strParentKey) > 0, Val(Mid(strParentKey, 2)), 0)

strText = Trim(Me![Text])

'Read child Node Option setting
childflag = Nz(Me.ChkChild.Value, 0)

intflag = 0

strSql = "INSERT INTO Sample ([Desc], [ParentID] ) "
If lngParentkey = 0 And childflag = 0 Then
    'Add Root-level Node, ParentKey is Blank
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & " "
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 1
ElseIf (lngParentkey >= 0) And (childflag = True) Then

    'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngKey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 2
ElseIf (lngParentkey >= 0) And (childflag = False) Then
    'Inserts Node at the check-marked level, Add item under the same ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngParentkey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 3
End If

Set db = CurrentDb
db.Execute strSql

'Get newly created autonumber to use as Key
lngID = DMax("ID", "Sample")
strIDKey = KeyPrfx & CStr(lngID)

On Error GoTo IdxOutofBound

Select Case intflag
    Case 1
        'Add Root-level Node, ParentKey is Blank
        tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open"
    Case 2
        'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
        tv.Nodes.Add strKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
    Case 3
        'Inserts Node at the check-marked level, Add item under the same ParentKey
        tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
End Select
tv.Refresh

    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With

Set db = Nothing
cmdExpand_Click
 
cmdAdd_Click_Exit:
Exit Sub

IdxOutofBound:
    CreateTreeView
Resume cmdAdd_Click_Exit
End Sub

Lassen Sie uns den VBA-Code untersuchen. Nach den lokalen Variablendeklarationen werden die TreeView-Knoten nach Häkchen durchsucht und nehmen eine Zählung der markierten Elemente vor. Wenn markierte Knoten mehr als einer sind, wird eine Meldung angezeigt und das Programm abgebrochen.

Hinweis: Anstelle des Häkchens können wir direkt auf einen Knoten klicken, um ihn auszuwählen. In beiden Fällen wird der Checked/Clicked-Knoten als Parameter an die Ereignisprozedur übergeben. Das Markieren ist gut, wenn Sie mehr als ein Element aus einem Projektmenü auswählen müssen, zum Beispiel:für die Auswahl eines anderen Datensatzes für einen bestimmten Bericht usw.

Die Eigenschaftswerte des markierten Knotens werden aus den Formularsteuerelementen in strKey gelesen , strParentKey, und strText. Die numerischen Werte ID, ParentID werden extrahiert und in lngKey gespeichert und lngParentKey Variablen zur Verwendung in SQL String.

Als nächstes der Child-Node Der Wert des Kontrollkästchens wird in ChildFlag gespeichert Variable.

Basierend auf dem ausgewählten Knoten und Child-Node werden drei verschiedene Sätze von SQL-Strings erstellt Kontrollkästchenoption über der Befehlsschaltfläche "Knoten hinzufügen".

  1. Falls Eltern-ID Eigenschaftswert auf dem Formular ist leer und der Child Node Kontrollkästchen nicht aktiviert ist, wird ein neuer Datensatz auf Stammebene erstellt, da der Benutzer einen Knoten auf Stammebene mit einem Häkchen versehen hat.
  2. Falls Eltern-ID Eigenschaftswert>=0 und Untergeordneter Knoten Kontrollkästchen ist aktiviert (markiert ), dann wird ein neuer Datensatz als untergeordneter Knoten des markierten Knotens erstellt. Der Schlüssel des markierten Knotens (ID) wird als ParentID im neuen Datensatz für den neuen Knoten verwendet.
  3. Falls Eltern-ID Wert >=0 und Untergeordneter Knoten Kontrollkästchen nicht ausgewählt (nicht aktiviert ), dann wird der neue Datensatz für den neuen Knoten auf derselben Ebene wie der markierte Knoten erstellt.

Das intFlag Die Variable wird mit einem der drei Werte festgelegt:1, 2 oder 3, abhängig von der Ausführung von SQL, als Hinweis auf den Knotentyp, der auf dem Tree View Control erstellt werden soll.

Als nächstes wird basierend auf der Auswahl der Optionen die SQL ausgeführt, um einen neuen Datensatz für die Probe zu erstellen Tabelle mit einem neuen AutoWert-ID-Feldwert.

Als nächstes die DMax() Die Funktion gibt die eindeutige Datensatz-ID als Schlüsselwert für den neuen Knoten zurück.

Basierend auf der Knotentypoption (1,2 oder 3) wird der Knoten auf dem Tree View Control erstellt.

Der Inhalt des Textfelds für die Eigenschaftsanzeige wird gelöscht.


Knoten oder Knoten mit untergeordneten Elementen löschen.

Der Löschknoten Option ist viel einfacher als die frühere Übung. Löscht einfach den mit einem Häkchen markierten Knoten und seine untergeordneten Elemente, sofern vorhanden, aus der Baumansichtssteuerung. Die zugehörigen Datensätze werden ebenfalls aus der Tabelle gelöscht.

Der VBA-Code zum Entfernen von Knoten ist unten angegeben:

Private Sub cmdDelete_Click()
Dim nodId As Long, nodParent As Long
Dim strSql As String
Dim db As DAO.Database
Dim j As Integer
Dim tmpnode As MSComctlLib.Node
Dim strKey As String
Dim strMsg As String

j = 0 ' Get check-marked Nodes count
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
        tmpnode.Selected = True
        strKey = tmpnode.Key
        j = j + 1
    End If
Next

   If j > 1 Then
      MsgBox "Selected Nodes: " & j & vbCr & "Select Only One Node to Delete.", vbCritical, "cmdDelete()"
      Exit Sub
   End If

Set tmpnode = tv.Nodes.Item(strKey)
tmpnode.Selected = True
Set db = CurrentDb

'check the presense of Child Node(s) of marked Node
If tmpnode.Children > 0 Then
'Warnings:
'       Deleting Nodes at Random will leave orphaned Nodes
'       in the Table and end up with errors, during next Tree View loading process
    strMsg = "The Marked Node have " & tmpnode.Children & " Children. " & vbCr & "Delete the Child Nodes also?"
    If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
       'Double check and get confirmation.
       strMsg = "Delete Only the deepest set of Child Nodes" & vbCr
       strMsg = strMsg & "and their Parent Node at one time." & vbCr & vbCr
       strMsg = strMsg & "Are you sure to Proceed..?"
       If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
            Do Until tmpnode.Children = 0
                nodId = Val(Mid(tmpnode.Child.Key, 2))
        'Delete Child Node
                tv.Nodes.Remove tmpnode.Child.Index
        'Delete the related record
                strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
                db.Execute strSql
            Loop
        Else
            Exit Sub
        End If
    Else
        Exit Sub
    End If
End If

        nodId = Val(Mid(tmpnode.Key, 2))
    'Delete Parent
       tv.Nodes.Remove tmpnode.Key
       tv.Refresh
    'Delete Marked Record
        strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
        db.Execute strSql
       
      
    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With
    Set db = Nothing
    
End Sub

Nach den lokalen Variablendeklarationen wird die For Each . . . Weiter Die Schleife zählt die Knoten mit Häkchen. Wenn mehr als ein markiertes Element gefunden wird, wird eine Meldung angezeigt und das Programm abgebrochen.

Wenn nur ein Element markiert ist, sucht der zweite Schritt Validierungsprüfung nach dem Vorhandensein von untergeordneten Knoten des ausgewählten Knotens. Wenn untergeordnete Knoten gefunden werden, wird eine Nachricht zu diesem Effekt angezeigt. Der Benutzer muss seine Absicht bestätigen, zuerst die untergeordneten Knoten und dann den mit einem Häkchen markierten übergeordneten Knoten zu löschen.

Hinweis: Benutzern wird empfohlen, zuerst die tiefste Ebene der untergeordneten Knoten oder alle untergeordneten Knoten der tiefsten Ebene mit ihrem unmittelbar übergeordneten Knoten zu löschen, indem sie nur den übergeordneten Knoten und nicht den übergeordneten Knoten markieren. Durch die Beschränkung der Löschregel auf diese Ebene bleibt der Kodex einfach und leicht verständlich. Ein Verstoß gegen diese Regel kann einige Knoten verwaisen lassen und beim nächsten Öffnen der Baumansicht zu Fehlern führen .

Die untergeordneten Knoten werden nacheinander entfernt und die entsprechenden Datensätze in der Tabelle werden ebenfalls nacheinander gelöscht. Löscht dann den markierten übergeordneten Datensatz.

Wenn der markierte Knoten keine untergeordneten Knoten hat, wird er sofort nach den Validierungsprüfungen gelöscht und der entsprechende Tabelleneintrag wird ebenfalls gelöscht.

Der Inhalt des Textfelds zur Eigenschaftsanzeige auf dem Formular wird gelöscht.


Der VBA-Code des vollständigen Klassenmoduls des Formulars frmSample.

Es folgt der vollständige VBA-Code in frmSample 's Klassenmodul, mit anderen kleinen Unterroutinen zum Erweitern von kollabierenden Knoten, TreeView0_NodeCheck Ereignisprozedur, cmdExit Befehlsschaltflächen-Klickereignis, Form_Load() Prozeduren und CreateTreeView() Unterprogramm:

Option Compare Database
Option Explicit

Dim tv As MSComctlLib.TreeView
Dim ImgList As MSComctlLib.ImageList
Const KeyPrfx As String = "X"

Private Sub cmdAdd_Click()
Dim strKey As String
Dim lngKey As Long
Dim strParentKey As String
Dim lngParentkey As Long
Dim strText As String
Dim lngID As Long
Dim strIDKey As String

Dim childflag As Integer
Dim db As DAO.Database
Dim strSql As String
Dim intflag As Integer
Dim tmpnode As MSComctlLib.Node

Dim i As Integer
i = 0
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
       tmpnode.Selected = True
        i = i + 1
    End If
Next
If i > 1 Then
      MsgBox "Selected Nodes: " & i & vbCr & "Select only One Node to mark Addition.", vbCritical, "cmdAdd()"
    Exit Sub
End If

'Read Property Values from Form
strKey = Trim(Me![TxtKey])
lngKey = Val(Mid(strKey, 2))

strParentKey = Trim(Me![TxtParent])
lngParentkey = IIf(Len(strParentKey) > 0, Val(Mid(strParentKey, 2)), 0)

strText = Trim(Me![Text])

'Read child Node Option setting
childflag = Nz(Me.ChkChild.Value, 0)

intflag = 0

strSql = "INSERT INTO Sample ([Desc], [ParentID] ) "
If lngParentkey = 0 And childflag = 0 Then
    'Add Root-level Node, ParentKey is Blank
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & " "
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 1
ElseIf (lngParentkey >= 0) And (childflag = True) Then

    'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngKey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 2
ElseIf (lngParentkey >= 0) And (childflag = False) Then
    'Inserts Node at the check-marked level, Add item under the same ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngParentkey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 3
End If

Set db = CurrentDb
db.Execute strSql

'Get newly created autonumber to use as Key
lngID = DMax("ID", "Sample")
strIDKey = KeyPrfx & CStr(lngID)

On Error GoTo IdxOutofBound

Select Case intflag
    Case 1
        'Add Root-level Node, ParentKey is Blank
        tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open"
    Case 2
        'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
        tv.Nodes.Add strKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
    Case 3
        'Inserts Node at the check-marked level, Add item under the same ParentKey
        tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
End Select
tv.Refresh

    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With

Set db = Nothing
cmdExpand_Click
 
cmdAdd_Click_Exit:
Exit Sub

IdxOutofBound:
    CreateTreeView
Resume cmdAdd_Click_Exit
End Sub

Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

Private Sub cmdDelete_Click()
Dim nodId As Long, nodParent As Long
Dim strSql As String
Dim db As DAO.Database
Dim j As Integer
Dim tmpnode As MSComctlLib.Node
Dim strKey As String
Dim strMsg As String

j = 0 ' Get check-marked Nodes count
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
        tmpnode.Selected = True
        strKey = tmpnode.Key
        j = j + 1
    End If
Next

   If j > 1 Then
      MsgBox "Selected Nodes: " & j & vbCr & "Select Only One Node to Delete.", vbCritical, "cmdDelete()"
      Exit Sub
   End If

Set tmpnode = tv.Nodes.Item(strKey)
tmpnode.Selected = True
Set db = CurrentDb

'check the presense of Child Node(s) of marked Node
If tmpnode.Children > 0 Then
'Warnings:
'       Deleting Nodes at Random will leave orphaned Nodes
'       in the Table and end up with errors, during next Tree View loading process
    strMsg = "The Marked Node have " & tmpnode.Children & " Children. " & vbCr & "Delete the Child Nodes also?"
    If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
       'Double check and get confirmation.
       strMsg = "Delete Only the deepest set of Child Nodes" & vbCr
       strMsg = strMsg & "and their Parent Node at one time." & vbCr & vbCr
       strMsg = strMsg & "Are you sure to Proceed..?"
       If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
            Do Until tmpnode.Children = 0
                nodId = Val(Mid(tmpnode.Child.Key, 2))
        'Delete Child Node
                tv.Nodes.Remove tmpnode.Child.Index
        'Delete the related record
                strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
                db.Execute strSql
            Loop
        Else
            Exit Sub
        End If
    Else
        Exit Sub
    End If
End If

        nodId = Val(Mid(tmpnode.Key, 2))
    'Delete Parent
       tv.Nodes.Remove tmpnode.Key
       tv.Refresh
    'Delete Marked Record
        strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
        db.Execute strSql
       
      
    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With
    Set db = Nothing
    
End Sub

Private Sub cmdExpand_Click()
Dim nodExp As MSComctlLib.Node

        For Each nodExp In tv.Nodes
            nodExp.Expanded = True
        Next

End Sub

Private Sub cmdCollapse_Click()
Dim nodExp As MSComctlLib.Node

        For Each nodExp In tv.Nodes
            nodExp.Expanded = False
        Next
End Sub

Private Sub Form_Load()
    CreateTreeView
    cmdExpand_Click
End Sub

Private Sub CreateTreeView()
Dim db As Database
Dim rst As Recordset
Dim nodKey As String
Dim ParentKey As String
Dim strText As String
Dim strSql As String

Set tv = Me.TreeView0.Object
tv.Nodes.Clear

'Pass ImageList control reference to TreeView's ImageList Property.
Set ImgList = Me.ImageList0.Object
tv.ImageList = ImgList

strSql = "SELECT ID, Desc, ParentID FROM Sample;"

Set db = CurrentDb
Set rst = db.OpenRecordset("sample", dbOpenTable)
Do While Not rst.EOF And Not rst.BOF
    If Nz(rst!ParentID, "") = "" Then
        nodKey = KeyPrfx & CStr(rst!ID)
        strText = rst!desc
        tv.Nodes.Add , , nodKey, strText, "folder_close", "folder_open"
    Else
        ParentKey = KeyPrfx & CStr(rst!ParentID)
        nodKey = KeyPrfx & CStr(rst!ID)
        strText = rst!desc
        tv.Nodes.Add ParentKey, tvwChild, nodKey, strText, "left_arrow", "right_arrow"
    End If
rst.MoveNext
Loop

rst.Close
On Error GoTo 0
Set rst = Nothing
Set db = Nothing

End Sub

Private Sub TreeView0_NodeCheck(ByVal Node As Object)
Dim xnode As MSComctlLib.Node

Set xnode = Node
  If xnode.Checked Then
    xnode.Selected = True

    With Me
        .TxtKey = xnode.Key
      If xnode.Text = xnode.FullPath Then
        .TxtParent = ""
      Else
        .TxtParent = xnode.Parent.Key
      End If
        .Text = xnode.Text
    End With
  Else
    xnode.Selected = False
    With Me
      .TxtKey = ""
      .TxtParent = ""
      .Text = ""
    End With
End If
End Sub

Die Entwurfsansicht des frmSample-Formulars ist unten angegeben:

Ihre Beobachtungen, Kommentare und Vorschläge sind willkommen.

Die Demo-Datenbank ist zum Download beigefügt.


WÖRTERBUCHOBJEKT

  1. Wörterbuchobjekte – Grundlagen
  2. Wörterbuchobjekt-Grundlagen-2
  3. Sortieren von Dictionary-Objektschlüsseln und -Elementen
  4. Datensätze aus Wörterbuch anzeigen
  5. Klassenobjekte als Wörterbucheinträge hinzufügen
  6. Klassenobjekt-Wörterbuchelement aktualisieren