L'utilizzo del
controllo ad albero può essere utile in varie
occasioni.
La possibilità di riprodurre graficamente in modo
gerarchico un archivio di dati (per esempio una
distinta base) garantisce un accesso ai dati
abbastanza comodo.
Access mette a
disposizione questo controllo che, sebbene pratico
e familiare nell'utilizzo, presenta delle
oggettive limitazioni che spesso ne hanno
decretato l'abbandono (lentezza, limite a circa
1000 items, impossibilità di utilizzare indici
numerici, ecc...).
In questo
tutorial proviamo ad inserire in un controllo ad
albero una semplice distinta base su 2 livelli e
proviamo a comprendere come "inserire" i dati
necessari. E' evidente che queste poche righe
devono servire solo come base di partenza per
sviluppi più complessi e non prevede una vera
gestione ad infiniti livelli in una distinta base.
Innanzi tutto
abbiamo preparato una tabella contenente degli
articoli:
Tabella Articoli
|
Codice |
Descrizione |
|
F001 |
Filo 1 mm |
|
F002 |
Filo 2 mm |
|
F003 |
Filo 3 |
|
F004 |
Filo 4 |
|
F005 |
Filo 5 |
|
M1 |
Molla Standard |
|
M2 |
Molla 2 |
|
M3 |
Molla 3 |
|
R21 |
Rivetto 21 |
|
V100 |
Vite 100 |
Successivamente
abbiamo preparato una seconda tabella in cui
abbiamo inserito la distinta base:
Tabella Articoli_Distinte
|
ProgrId |
Padre |
Figlio |
Qta |
|
1 |
M1 |
F001 |
10 |
|
2 |
M1 |
F003 |
12 |
|
3 |
F002 |
R21 |
1 |
|
4 |
F002 |
V100 |
0 |
|
5 |
M2 |
F005 |
11 |
|
6 |
M3 |
F002 |
1 |
|
7 |
M3 |
F004 |
10 |
|
8 |
M1 |
V100 |
1 |
Il codice Figlio
indica che quello è un componente del codice
Padre.
M1 è quindi composto da F001, da F003 e da V100
(chiaramente sono esempi inventati).

Caricamento della maschera frmTree
Quando si apre la maschera frmTree viene avviato
con l'evento Su caricamento il codice
seguente che provvede a lanciare in successione
prima la routine che carica il primo livello e poi
quella che lancia il secondo (ognuno è libero di
sviluppare sistemi diversi, basta aver chiaro come
leggere e caricare i dati):
Private Sub
Form_Load()
Crea_Root
Crea_Root_2
End Sub
Caricamento del primo livello
La routine da lanciare è riportata sotto.
In pratica sono letti tutti i record della query
Articoli_Q1 ed aggiunti nella radice dell'albero.
Leggete le note in verde per comprendere il
trattamento degli argomenti:
Sub Crea_Root()
Dim objNode As Node
Dim objTree As TreeView
Dim rstArticoli As New ADODB.Recordset
Dim intParentKey As Integer
Dim level As Integer
Set objTree = Me.objTree.Object
objTree.Nodes.Clear
rstArticoli.Open "SELECT * FROM Articoli_Q1",
CurrentProject.Connection, adOpenKeyset,
adLockBatchOptimistic
Do Until rstArticoli.EOF
'
Spiegazioni argomenti per metodo add
| |
1° |
2° |
3° |
4° |
|
Set objNode = objTree.Nodes.Add( |
, |
, |
rstArticoli!CodiceArt, |
rstArticoli!CodiceArt) |
' Il primo è mancante perchè è un nodo di radice
' Il secondo è mancante: dovrebbe specificare come
un nodo si collega
' Il terzo fornisce una chiave univoca per il
nuovo nodo (non sono ammessi solo numeri).
' Il quarto specifica il testo visualizzato
Set objNode = objTree.Nodes.Add(, , rstArticoli!CodiceArt,
rstArticoli!CodiceArt)
rstArticoli.MoveNext
Loop
rstArticoli.Close
End Sub
Caricamento del secondo livello
La routine da lanciare è riportata sotto.
In pratica sono letti tutti i record della query
Articoli_Q2 ed aggiunti nel livello successivo
dell'albero. Leggete le note in verde per
comprendere il trattamento degli argomenti e
notate le differenze con la routine precedente:
Sub
Crea_Root_2()
Dim objNode As Node
Dim objTree As TreeView
Dim rstArticoli2 As New ADODB.Recordset
Dim Padre As String, Figlio As String,
Indice_Figlio As String
Set objTree = Me.objTree.Object
rstArticoli2.Open "SELECT * FROM Articoli_Q2",
CurrentProject.Connection, adOpenKeyset,
adLockBatchOptimistic
Do Until rstArticoli2.EOF
Padre = rstArticoli2!CodPadre
Figlio = rstArticoli2!CodiceArt
Indice_Figlio = "R" & rstArticoli2!ProgrId
'
Spiegazioni argomenti per metodo add
| |
1° |
2° |
3° |
4° |
|
Set objNode = objTree.Nodes.Add( |
Padre, |
tvwChild, |
Indice_Figlio, |
Figlio) |
' Il primo è il nodo padre
' Il secondo specifica che esiste la relazione con
il padre
' Il terzo fornisce una chiave univoca per
l'articolo componente (non sono ammessi solo numeri).
' Il quarto specifica il testo visualizzato
Set objNode = objTree.Nodes.Add(Padre, tvwChild,
Indice_Figlio, Figlio)
rstArticoli2.MoveNext
Loop
rstArticoli2.Close
End Sub
Potete ora fare
un po' di pratica ed utilizzare il controllo nelle
vostre applicazioni.
Potrete per esempio scoprire come utilizzare
immagini nel controllo.
Nell'esempio
allegato si vede come creare eventi al clic del
mouse sui nodi.
Scaricate il file per access 2000/XP
|