Selezionare un Nodo di una TreeView tramite la sua Chiave


Per mostrarVi l'esecuzione della Ricerca per chiave in una TreeView creiamo una specie di Calendario ad albero. Dove la chiave da cercare sarà la data, tipo 27/3/2002 oppure 15/10/2001 etc.

Inserire in un Form:

Una Treeview
Una Label con la Caption= Chiave da cercare 
Una Textbox
Un CommandButton con Caption=Avvia la ricerca

Inserire il seguente codice:

Option Explicit

'Variabile a livello di modulo per oggetti Node.
Private m_Node As Node
'Contatore dei Nodi della Treeview
Private m_lCount As Long

Private Sub Command1_Click()
    If RicercaChiaveTv(Text1.Text) = False Then
        MsgBox "Chiave non trovata", vbExclamation
    End If
End Sub

Private Sub Form_Load()
    CreaTreview
    With TreeView1
        'seleziono il primo nodo
        Set .SelectedItem = .Nodes(1)
        'e lo espando
        .SelectedItem.Expanded = True
    End With
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 13 Then
        Command1.Value = True
    End If
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
    'Imposta il nodo.
    Set Node = TreeView1.SelectedItem
End Sub

'*********************************************
'Controlla se l'anno digitato è bisestile.
'yr = anno da controllare
'*********************************************

Public Function AnnoBisestile(ByVal yr As Integer) As Boolean
    If ((yr Mod 4) = 0) Then
        AnnoBisestile = ((yr Mod 100) > 0) Or ((yr Mod 400) = 0)
    End If
End Function

Public Sub CreaTreview()
    Dim i As Integer, y As Integer, k As Integer
    Dim sMeseAttuale As String
    Dim sAnnoAttuale As String
    Dim sKey As String
    Dim iNumGiorni As Integer
    Dim sGiorno As String

    With TreeView1
        Set m_Node = .Nodes.Add(, , "Data", "Anni")
        'contatore dei Nodi della Treeview.
        'Utilizzo questo e non TreeView1.Nodes.Count,
        'perchè il secondo può contenere solo un numero
        'intero. Onde per cui dopo 32768 torna indietro
        'con numeri negativi e così di seguito.
        'Logicamente utilizzando m_lCount come contatore,
        'si deve prevedere a decrementarlo manualmente
        'in caso di eliminazione di un Nodo.

        m_lCount = 1
        For k = 2000 To 2004
    
            sAnnoAttuale = CStr(k)
            sKey = "/" & sAnnoAttuale
            Set m_Node = .Nodes.Add("Data", tvwChild, sKey, sAnnoAttuale)
            m_lCount = m_lCount + 1
            For i = 1 To 12
                sMeseAttuale = CStr(i) & "/" & CStr(k)
                sKey = sMeseAttuale
                Set m_Node = .Nodes.Add("/" & sAnnoAttuale, tvwChild, sKey, StrConv(MonthName(i), vbProperCase))
                m_lCount = m_lCount + 1

                'calcolo i giorni del mese
                Select Case i
                    Case 1, 3, 5, 7, 8, 10, 12
                        iNumGiorni = 31
                    Case 2
                        'controlla se l'anno è bistestile ed
                        'eventualmente varia il mese a 29

                        If AnnoBisestile(k) Then
                            iNumGiorni = 29
                        Else
                            iNumGiorni = 28
                        End If
                    Case Else
                        iNumGiorni = 30
                End Select
    
                '
aggiungo i giorni nella treeview
                For y = 1 To iNumGiorni
                    sKey = CStr(y) & "/" & sMeseAttuale
                    sGiorno = WeekdayName(Weekday(CStr(y) & "/" & CStr(i) & "/" & CStr(k)), , vbSunday)
    
                    'Aggiungo un nodo figlio nel controllo TreeView
                    Set m_Node = .Nodes.Add(sMeseAttuale, tvwChild, sKey, CStr(y) & " " & sGiorno)
                    m_lCount = m_lCount + 1
                Next y
            Next i
        Next k
    End With
End Sub

Public Function RicercaChiaveTv(sNodKey As String) As Boolean
    Dim i As Long

    'setto il flag di ricerca a false
    RicercaChiaveTv = False
    'ricerca il nodo
    For i = 1 To m_lCount
        If UCase$(TreeView1.Nodes(i).Key) = UCase$(sNodKey) Then
            'seleziona il nodo
            TreeView1.SelectedItem = TreeView1.Nodes(i)
            'lo apre
            TreeView1_NodeClick TreeView1.Nodes(i)
            'setta il fuoco sulla Treeview
            TreeView1.SetFocus
            'setto il flag di ricerca a true (elemento trovato)
            RicercaChiaveTv = True
            Exit For
        End If
    Next
End Function

Avviare con F5 e buona ricerca.

Testato su: tutti i sistemi operativi