Access
 sql >> Database >  >> RDS >> Access

Controllo della visualizzazione ad albero Segno di spunta Aggiungi Elimina nodi

Introduzione.

In questo episodio dell'esercitazione sul controllo della visualizzazione ad albero impareremo come aggiungere/eliminare Nodi. La posizione dell'elemento candidato Aggiungi/Elimina sarà contrassegnata, dove vogliamo Aggiungi() il nuovo nodo o su Rimuovi() il Nodo contrassegnato. L'aggiunta del Nodo può essere allo stesso livello del Nodo contrassegnato o di un Nodo figlio.

Le sessioni del tutorial di controllo TreeView finora.

  1. Esercitazione sul controllo di Microsoft TreeView
  2. Creazione del menu di accesso con il controllo TreeView
  3. Assegnazione di immagini al controllo TreeView
  4. Assegnazione di immagini a TreeView Control-2

La visualizzazione normale del controllo della visualizzazione dell'albero della demo su MS-Access Form, con altri controlli, è riportata di seguito.

La tabella dati per la demo di TreeView Control.

La tabella con il nome Campione che abbiamo utilizzato nella prima Sessione di Tutorial, lo metteremo in pratica anche qui. È una piccola tabella con i record della struttura dei controlli di Access Database, tabelle, Moduli e Report, disposti in ordine gerarchico e di facile comprensione.

L'ID colonna (Vista ad albero Chiave ) è un campo di numerazione automatica.

I nuovi visitatori vengono aggiornati per questa sessione di tutorial.

Se non hai completato la prima sessione del tutorial, puoi scaricare il database demo dalla seconda pagina della sessione:creazione del menu di accesso con controllo della visualizzazione ad albero. C'è una tabella in quel database con il nome:Campione e Modulo frmSample . Puoi importarli nel tuo database attuale. Esiste un altro modulo con il nome frmMenu lì dentro e puoi copiare i pulsanti di comando Espandi tutto Comprimi tutto e il relativo pulsante di comando Fare clic su Procedure evento da frmMenu al frmSample Modulo codice per continuare con questa sessione.

Come ho accennato in precedenza, possiamo condividere il controllo ImageList, con le immagini caricate su altri progetti, faremo una copia del controllo ImageList dell'ultima sessione di Tutorial e lo porteremo qui, con tutte le immagini caricate, e lo useremo sul Nodi di controllo della visualizzazione ad albero su frmSample .

Importazione del controllo ImageList con le immagini.

Puoi portare il controllo ImageList che hai già, con le immagini caricate in un altro database, nei seguenti modi:

  1. Importa il modulo con il controllo ImageList nel database attivo, dal database in cui hai il controllo ImageList con le immagini caricate manualmente. Copia e incolla il controllo ImageList nel modulo, dove vuoi.

  2. Oppure, copia prima il controllo ImageList negli Appunti, dal database, dove lo hai. Se hai scaricato il database demo dalla precedente sessione tutorial, hai già il controllo ImageList con le immagini caricate. Chiudere il database dopo aver copiato il controllo ImageList negli Appunti.

  3. Aprire il database di destinazione e aprire il modulo in cui si desidera il controllo ImageList e incollarlo nel modulo.

    Con le seguenti righe di codice in CreateTreeView() Sotto-routine puoi passare il riferimento all'oggetto ImageList al controllo della visualizzazione ad albero.

    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 

Modificare i Nomi Oggetti evidenziati nel Codice, se sono diversi nel Modulo.

Successivamente, puoi aggiungere i nomi delle chiavi dell'immagine in TreeView Nodes.Add() gli ultimi due parametri del metodo.

Questi esercizi li abbiamo già fatti nelle sessioni precedenti. Per ricordarti che stiamo utilizzando il controllo di visualizzazione tabella e albero che abbiamo creato nella prima sessione del tutorial e implementato con le modifiche sopra spiegate.

Visualizzazione dei valori delle proprietà dei nodi contrassegnati da un segno di spunta.

La Chiave del nodo selezionato , Chiave principale e Testo Le proprietà vengono visualizzate nelle caselle di testo sul lato destro del controllo della visualizzazione ad albero. La casella di controllo con la didascalia:Nodo figlio l'Elimina Nodo, e Aggiungi nodo I pulsanti di comando sono nuove aggiunte al modulo. Le loro funzioni verranno spiegate a breve.

Visualizzazione delle caselle di controllo sul controllo TreeView.

Normalmente, la casella di controllo non viene visualizzata sul controllo TreeView, a meno che non si abiliti una proprietà nel foglio delle proprietà del controllo TreeView. Ha solo alcune funzionalità limitate qui. Qualunque cosa faremo qui può essere eseguita anche senza la casella di controllo.

Un approccio migliore per l'utilizzo dei CheckBox può essere, come la preparazione di un Report sulle sedi selezionate delle filiali delle attività della Società, basato su scelte casuali di filiali selezionabili dall'utente, dal Menu Progetto di Access.

In questo caso, l'obiettivo è fornire una conoscenza di questa funzionalità ed eseguire una demo sul suo utilizzo.

  1. Apri il modulo con il controllo TreeView in Visualizzazione struttura.
  2. Fai clic con il pulsante destro del mouse sul controllo TreeView, evidenzia l'Oggetto TreeCtrl , seleziona le Proprietà opzione per visualizzare la finestra delle proprietà.
  3. Metti un segno di spunta sulle Caselle di controllo opzione sul controllo delle proprietà come mostrato nell'immagine riportata di seguito.

L'immagine demo TreeView riportata in alto, Dettagli.

Vediamo cosa abbiamo nel modulo demo frmSample presentato in cima a questa pagina. Il controllo della visualizzazione ad albero e i primi due pulsanti di comando, Espandi tutto e Comprimi tutto, su Click Espande o Comprimi i Nodi e abbiamo visto le loro funzioni nell'ultimo episodio.

Sul lato destro ci sono tre TextBox, sotto l'intestazione Label:Property Values , per visualizzare la Chiave del nodo contrassegnata , Chiave genitore e Testo Valori.

Elimina nodo Il pulsante di comando rimuove il nodo contrassegnato o il nodo e i suoi nodi figlio.

Prima di selezionare il pulsante di comando Aggiungi nodo , il Testo Il valore della proprietà deve essere modificato per sostituirlo con il nuovo valore di testo per il nuovo nodo.

Sopra Aggiungi nodo Pulsante di comando, è presente una Casella di controllo con l'etichetta Child Node. Aggiungi nodo e Nodo figlio Le caselle di controllo lavorano insieme per impostare la regola, su dove dovrebbe apparire il nuovo nodo.

Informazioni sull'azione Aggiungi nodo.

Supponi di voler aggiungere un nuovo nodo per Collegamento ipertestuale campo sotto i Campi tipo di dati gruppo (o nodo padre) Elenco. Guarda l'immagine demo fornita in cima a questa pagina, dove ho spuntato il campo della data Node, tra gli altri nodi figlio. Le schede delle proprietà sul lato destro mostrano la sua chiave:X15 , ParentKey:X4 &Testo:Campo data Descrizione.

Modifica il testo:Campo data a collegamento ipertestuale nella casella di testo di visualizzazione Proprietà e fare clic su Aggiungi nodo Pulsante di comando. L'output sarà come mostrato di seguito:

Se selezioni i Campi elemento nodo padre e metti un segno di spunta nel Nodo figlio opzione, sopra Aggiungi nodo Pulsante di comando, otterrai lo stesso risultato.

Se invece tieni il segno di spunta Node nel Campo Data e imposta il segno di spunta su Child-Node opzione sopra Aggiungi nodo Pulsante di comando, otterrai il risultato come mostrato di seguito.

Il nodo figlio verrà creato sotto il nodo con segno di spunta.

Le azioni Aggiungi nodo devono prima creare un nuovo record nella tabella sottostante.

Viene creato un nuovo record nel campione Tabella, con il nuovo Testo:HyperLink e ID genitore Valori. Il campo AutoNumber genera un nuovo numero e lo recuperiamo e lo utilizziamo come valore chiave per il nodo.

Il codice VBA della subroutine Aggiungi nodo è riportato di seguito:

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

Esaminiamo il codice VBA. Dopo le dichiarazioni di variabili locali, i nodi TreeView vengono scansionati per individuare i segni di spunta e acquisiscono un conteggio degli elementi contrassegnati. Se i nodi contrassegnati sono più di uno, mostra un messaggio e interrompe il programma.

Nota: Invece di Check-Marking possiamo fare clic direttamente su un nodo per selezionarlo. In entrambi i casi, il Checked/Clicked Node viene passato come parametro alla Event Procedure. Il segno di spunta è utile quando devi selezionare più di un elemento da un Menu Progetto, ad esempio:per la selezione di un diverso insieme di Dati per un particolare report, ecc.

I valori delle proprietà del nodo selezionato vengono letti dai controlli del modulo in strKey , strParentKey, e strText. L'ID, i valori numerici ParentID vengono estratti e salvati in lngKey e lngParentKey Variabili da utilizzare in SQL String.

Successivamente, il Nodo figlio Il valore della casella di controllo viene salvato in ChildFlag Variabile.

Vengono creati tre diversi set di stringhe SQL in base al nodo selezionato e al nodo figlio Opzione Casella di controllo sopra il pulsante di comando Aggiungi nodo.

  1. Se ID genitore Il valore della proprietà nel modulo è vuoto e il nodo figlio la casella di controllo non è selezionata, quindi verrà creato un nuovo record a livello di radice perché l'utente ha contrassegnato un nodo a livello di radice.
  2. Se ID genitore Valore della proprietà>=0 e Nodo figlio la casella di controllo è selezionata (selezionata ) quindi viene creato un nuovo record come nodo figlio per il nodo con segno di spunta. La Chiave del nodo contrassegnata (ID) viene utilizzato come ParentID sul nuovo record per il nuovo nodo.
  3. Se ID genitore Valore >=0 e Nodo figlio opzione casella di controllo non selezionata (non selezionata ) quindi viene creato il Nuovo Record per il nuovo Nodo, allo stesso livello del Nodo contrassegnato.

La intFlag La variabile viene impostata con uno dei tre valori:1,2 o 3, a seconda dell'esecuzione dell'SQL, come indicazione del tipo di Nodo da creare sul controllo Tree View.

Successivamente, in base alla selezione delle opzioni, viene eseguito l'SQL per creare un nuovo record sul campione Tabella, con un nuovo valore campo ID AutoNumber.

Successivamente, il DMax() La funzione restituisce l'ID record univoco come valore-chiave per il nuovo nodo.

In base all'opzione Tipo di nodo (1,2 o 3) il nodo viene creato nel controllo della visualizzazione ad albero.

Il contenuto della casella di testo della visualizzazione delle proprietà viene cancellato.


Eliminazione di un nodo o di un nodo con elementi secondari.

Il Elimina nodo L'opzione è molto più semplice dell'esercizio precedente. Elimina semplicemente il nodo contrassegnato da un segno di spunta e i suoi figli, se presenti, dal controllo della visualizzazione ad albero. Anche i record relativi vengono eliminati dalla tabella.

Il codice VBA per la rimozione dei nodi è riportato di seguito:

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

Dopo le dichiarazioni di variabili locali, il For Each . . . Avanti Il ciclo conta i nodi con segni di spunta. Se è stato trovato più di un elemento contrassegnato, viene visualizzato un messaggio e il programma viene interrotto.

Se è presente un solo elemento contrassegnato, il secondo passaggio Verifica di convalida cerca la presenza di nodi figlio del nodo selezionato. Se vengono trovati nodi figlio, viene visualizzato un messaggio su tale effetto. L'Utente deve riconfermare la propria intenzione di procedere all'eliminazione prima dei Nodi figlio e poi del Nodo genitore contrassegnato.

Nota: Si consiglia agli utenti di eliminare prima il livello più profondo dei nodi secondari, o tutti i nodi secondari di livello più profondo con il loro nodo principale immediato, contrassegnando solo il nodo principale, senza contrassegnare il nodo nonno. Limitare la regola di cancellazione a questo livello manterrà il Codice semplice e di facile comprensione. La violazione di questa regola potrebbe lasciare alcuni nodi orfani e causare errori alla successiva apertura della Visualizzazione ad albero .

I nodi figlio vengono rimossi uno per uno e anche i record corrispondenti sulla tabella vengono eliminati, uno dopo l'altro. Quindi elimina il record padre contrassegnato.

Se il nodo contrassegnato non ha nodi figlio, viene eliminato immediatamente dopo i controlli di convalida e viene eliminato anche il record della tabella corrispondente.

Il contenuto della casella di testo di visualizzazione Proprietà nel modulo viene cancellato.


Il codice VBA del modulo di classe completo di Form frmSample.

Di seguito è riportato il codice VBA completo in frmSample 's Class Module, con altre piccole subroutine per espandere i nodi compressi, TreeView0_NodeCheck Procedura dell'evento, cmdExit Pulsante di comando Fare clic su Evento, Form_Load() Procedure e CreateTreeView() Sottoprogramma:

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

La visualizzazione del progetto del modulo frmSample è riportata di seguito:

Le vostre osservazioni, commenti, suggerimenti sono i benvenuti.

Il database demo è allegato per il download.


OGGETTO DIZIONARIO

  1. Nozioni di base sugli oggetti del dizionario
  2. Nozioni di base sugli oggetti del dizionario-2
  3. Ordinamento delle chiavi e degli elementi degli oggetti del dizionario
  4. Visualizza record dal dizionario
  5. Aggiungi oggetti classe come elementi del dizionario
  6. Aggiorna l'elemento del dizionario degli oggetti della classe