Llenar TreeView de forma recursiva

Luego de mucho pensar he podido escribir una función que permite llenar un TreeView de forma recursiva, nos vamos a ayudar de listas genéricas y de una clase para poder pasar en cada llamada los datos que van a ir en los nodos.

Primero vamos a definir la clase que va a contener los datos de los nodos del árbol, vamos a crear las siguientes propiedades: código del nodo, código del padre, descripción o texto que se va a mostrar en el nodo, y URL en caso de que al dar clic sobre el nodo se direccione a alguna página, la definición sería:
  • Private Class TreeMenu
  • Public Codigo As Integer
  • Public Padre As Integer
  • Public Desc As String
  • Public URL As String
  • End Class
Como los datos se encuentran almacenados en una tabla de base de datos (se utiliza la estructura del post Menú dinámico desde base de datos con Sql Server y ASP.Net - Parte I ) vamos crear una lista genérica del tipo TreeMenu para pasar los datos que se encuentran en el datatable y crear la estructura de datos que nos va permitir llenar el árbol.

  • Dim lstMenuItem As New Collections.Generic.List(Of TreeMenu)
  • For Each r As Data.DataRow In dt.Rows
  • Dim Item As New TreeMenu
  • Item.Codigo = r("CODIGO")
  • Item.Padre = r("CODIGOPADRE")
  • Item.Desc = r("DESCRIPCION")
  • Item.URl = r("URL")
  • lstMenuItem.Add(Item)
  • Next

Para que funcione la recursividad necesitamos insertar el nodo raíz del árbol ya que la función utiliza TreeNodeCollection para poder añadir los nodos al árbol

  • TreeView1.Nodes.Add(New TreeNode("Root"))
  • LlenarTreeView(20000, lstMenuItem, TreeView1.Nodes) ' 2000 es el código del padre de donde se inicia el árbol
Y la función recursiva es:

  • Private Sub LlenarTreeView(ByVal CodPadre As Integer , ByRef NodoItems As Collections.Generic.List(Of TreeMenu) , ByRef Nodos As TreeNodeCollection)
  • For Each tm As TreeMenu In NodoItems
  • If CodPadre = tm.Padre Then
  • Nodos(Nodos.Count - 1).ChildNodes.Add(New TreeNode(tm.Desc, tm.Codigo, "", tm.URL, ""))
  • LlenarTreeView(tm.Codigo, NodoItems, Nodos(Nodos.Count - 1).ChildNodes)
  • End If
  • Next
  • End Sub

Enlaces relacionados
Recorrer TreeView en forma recursiva
Menú dinámico desde base de datos con Sql Server y ASP.Net - Parte I

10 comentarios:

Haver dijo...

El codigo esta muy interesante, y te agradesco la ayuda pero seria mucho pedir pudieras subir un ejemplo? o el codigo que aca colocas para entenderlo mejor...Gracias

Anónimo dijo...

Compare.. muy buen codigo..

Ya me estaba rompiendo la cabeza buscado una manera efectiva de llenar un treeview.. probe muchos ejemplos sin obtener resultados.. pero este me resultó de una.

..gracias

-Giovanni-

Anónimo dijo...

Hermano permíteme decirte que eres un chingón y que me ahorraste mucho tiempo, felicidades.

Anónimo dijo...

Hola, en el siguiente código:

'Nodos(Nodos.Count - 1).ChildNodes.Add(New TreeNode(tm.Desc, tm.Codigo, "", tm.URL, ""))


No aparece la propiedad "ChildNodes" en vb Net 2005. Algun comentario sobre eso?

Anónimo dijo...

Muchas gracias, me ha venido muy bien

Anónimo dijo...

Genio!!!, me salvaste en la tesis.
Saludos.

Anónimo dijo...

Ola ke tal trate de cambiar el codigo a C# y me marka un error de que los argumentos no son validos es al monento de enviar el parametro TreeNodeCollection me podrian ayudar

Anónimo dijo...

Alguien puede subir algun proyecto con el codigo implementeado, que no lo puedo hacer correr.

Dxs dijo...

Muy bueno che! estaba peleándome un poquito con la recursividad para llenar dinamicamente un treeview y me salvaste!! jaja!

Saludos!°

el_Prieta dijo...

Perfecto preciso y conciso

muchas gracias!!!!