Quasi sempre un controllo TreeView viene popolato in maniera dinamica, con i nodi che vengono creati e modificati al "volo". In genere i nodi appartengono a collection di oggetti che rappresentano il singolo nodo con le relative relazioni padre-figlio. Sfruttando queste collection e le relazioni tra nodo padre e nodo figlio, ecco come popolare da codice un controllo TreeView :
Nodo root = new Nodo("Lettere e Nomi"); // Per la definizione della classe Nodo si legga
qui int targetNodeCounter = 0;
//Codice di esempio per creare dei nodi e delle relazioni dimostrative
Nodo a = new Nodo("A");
Nodo alessandro = new Nodo("Alessandro");
Nodo armando = new Nodo("Armando");
Nodo amilcare = new Nodo("Amilcare");
a.AddChild(alessandro);
alessandro.AddParent(a);
a.AddChild(armando);
armando.AddParent(a);
a.AddChild(amilcare);
amilcare.AddParent(a);
Nodo b = new Nodo("B");
Nodo biagio = new Nodo("Biagio");
Nodo betty = new Nodo("Betty");
b.AddChild(biagio);
b.AddChild(betty);
Nodo c = new Nodo("C");
Nodo carlo = new Nodo("Carlo");
Nodo carmela = new Nodo("Carmela");
c.AddChild(carlo);
c.AddChild(carmela);
root.AddChild(a);
root.AddChild(b);
root.AddChild(c);
//Fine creazioni relazioni
targetNodeCounter = 0;
Print(treeView1, root); // Richiamando il metodo Print si avvia il processo iterativo che ciclia la collection root e visita tutto l'albero creando ogni volta i nodi nel TreeView
treeView1.ExpandAll();
private void Print(TreeView tree, Nodo root)
{
tree.Nodes.Add(new TreeNode(root.Text));
TreeNode tNode = new TreeNode();
if (targetNodeCounter == 0)
{
tNode = tree.Nodes[0];
targetNodeCounter++;
}
else
{
tNode = tree.Nodes[targetNodeCounter];
targetNodeCounter++;
}
AddNode(root, tNode);
}
private void AddNode(Nodo nodo, TreeNode inTreeNode)
{
Nodo xNode;
TreeNode tNode;
int i;
if (nodo.Children.Count > 0)
{
for (i = 0; i <= nodo.Children.Count - 1; i++)
{
xNode = nodo.Children[i];
inTreeNode.Nodes.Add(new TreeNode(xNode.Text));
tNode = inTreeNode.Nodes[i];
AddNode(xNode, tNode);
}
}
}
Notare che utilizzando targetNodeCounter per indicare l'indice della radice è possibile creare più elementi root!Se avessimo un root_1 ed un root_2, si avrebbe :
targetNodeCounter = 0;
Print(treeView1, root_1);
Print(treeView1, root_2);
Enjoy!