Manipular un TreeView por código

2602 vistas

La manipulación del árbol de un TreeView puede ser compleja si el concepto de nodo no lo tenemos bien asimilado. Los objetos TreeNodes que componen un bjeto TreeView son colecciones recursivas a las que podemos aplicar las siguiente reglas:

  • Sólo existe un nodo 'Root' y se identifica por su valor "Nothing" de su parent
  • Un nodo sólo tiene un parent
  • Un nodo sólo da información de sus descendientes directos

Como són colecciones recursivas, podrÃamos hacer una función que recorra todos los nodos hijos del nodo pasado por parámetro:



vbnet
  1. Private Sub RecorrerNodos(ByVal MiNodo As TreeNode)
  2.     MsgBox(MiNodo.ToString)
  3.     Dim MiEnum As IEnumerator = MiNodo.Nodes.GetEnumerator
  4.     While MiEnum.MoveNext
  5.         RecorrerNodos(CType(MiEnum.Current, TreeNode))
  6.     End While
  7. End Sub



No es sencillo saber la posición gerárquica de un nodo. Para encontrarla, podemos realizar la siguiente función recursiva:



vbnet
  1. Private Function Nivel(ByVal MiNodo As TreeNode, ByVal Start As Boolean) As Int32
  2.     Static Pos As Int32
  3.     If Start Then Pos = 0
  4.     If MiNodo.Parent Is Nothing Then
  5.         Return Pos
  6.     Else
  7.         Pos += 1
  8.         Nivel(MiNodo.Parent, False)
  9.         Return Pos
  10.     End If
  11. End Function



Ejemplo de llamada:



vbnet
  1. MsgBox(Nivel(Me.TreeView1.SelectedNode, True).ToString)



No obstante, a menudo este método no es el más obtimo, devido a que los procedimientos recursivos son costosos en recursos. En la construcción del TreView se suele saber el nivel gerárquico del nodo que se está almacenando, por lo que puede ser una buena práctica almacenar el nivel en la propiedad Tag del nuevo nodo.