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 |
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