Llenar un TreeView desde un DataSet en VB .NET

Utilizar la jerarquía definida en los datos de una tabla para llenar un TreeView con un método recurrente sencillo (en VB. NET).

 

Fecha: 25/Jul/2005 (24/07/2005)
Autor: Serge Valsse (svalsse@hotmail.com)

 


Atendiendo a la solicitud de muchos programadores que necesitaban el código en VB del ejemplo del artículo: Llenar un TreeView desde un DataSet usando un método recurrente que está escríto en C# y que fue publicado en este mismo sitio en la siguiente dirección: http://www.elguille.info/colabora/NET2005/svalsse_llenar_un_treeview.htm, publico este mismo ejemplo pero como ya dije en VB .NET.

Si no has leído el artículo anterior, te recomiendo que lo hagas para que veas el planteamiento del problema a resolver, ya que aquí expondré la solución en VB directamente para no repetir las partes comunes del artículo anterior.

Bien, la idea es llenar un TreeView con los datos contenidos en una tabla. Normalmente se tiene bien clara la jerarquía de los datos que se desean mostrar en la misma estructura de la tabla y esto se puede aprovechar para evitar estar definiendo nodo por nodo en el TreeView.

Creación de un formulario que llene un TreeView desde un DataSet usando un método recurrente

Para el ejemplo seguiremos los siguientes pasos:

1. Crear un proyecto de tipo Proyectos de Visual Basic, Aplicación para Windows y llámelo EjemploTreeView.

2. En el formulario generado (Form1) agrega dos controles, un TreeView y un Button. Desde la ventana de propiedades del botón asignar la propiedad Text = "Llenar TreeView".

3. Declara un DataSet que pueda ser visto por toda la clase Form1 (para ello hay que hacer la declaración en la sección "Declarations" del Form1).

Private dataSetArbol As System.Data.DataSet
4. En la ventana de Código agrega el método que se ejecutará recurrentemente llamándolo CrearNodosDelPadre.
Private Sub CrearNodosDelPadre(ByVal indicePadre As Integer, ByVal nodePadre As TreeNode)

    Dim dataViewHijos As DataView

    ' Crear un DataView con los Nodos que dependen del Nodo padre pasado como parámetro.
    dataViewHijos = New DataView(dataSetArbol.Tables("TablaArbol"))

    dataViewHijos.RowFilter = dataSetArbol.Tables("TablaArbol").Columns("IdentificadorPadre").ColumnName + " = " + indicePadre.ToString()

    ' Agregar al TreeView los nodos Hijos que se han obtenido en el DataView.
    For Each dataRowCurrent As DataRowView In dataViewHijos

        Dim nuevoNodo As New TreeNode
        nuevoNodo.Text = dataRowCurrent("NombreNodo").ToString().Trim()

        ' si el parámetro nodoPadre es nulo es porque es la primera llamada, son los Nodos
        ' del primer nivel que no dependen de otro nodo.
        If nodePadre Is Nothing Then
            TreeView1.Nodes.Add(nuevoNodo)
        Else
            ' se añade el nuevo nodo al nodo padre.
            nodePadre.Nodes.Add(nuevoNodo)
        End If

        ' Llamada recurrente al mismo método para agregar los Hijos del Nodo recién agregado.
        CrearNodosDelPadre(Int32.Parse(dataRowCurrent("IdentificadorNodo").ToString()), nuevoNodo)
    Next dataRowCurrent

End Sub
5. Para simplificar el ejemplo, adiciona los siguientes métodos que simularán los datos obtenidos desde una base de datos.
Private Sub CrearDataSet()
    Dim tablaArbol As DataTable

    dataSetArbol = New DataSet("DataSetArbol")

    tablaArbol = dataSetArbol.Tables.Add("TablaArbol")
    tablaArbol.Columns.Add("NombreNodo", GetType(String))
    tablaArbol.Columns.Add("IdentificadorNodo", GetType(Integer))
    tablaArbol.Columns.Add("IdentificadorPadre", GetType(Integer))

    InsertarDataRow("Nodo 1", 1, 0)
    InsertarDataRow("Nodo 1.1", 2, 1)
    InsertarDataRow("Nodo 1.1.1", 3, 2)
    InsertarDataRow("Nodo 1.1.2", 4, 2)
    InsertarDataRow("Nodo 1.2", 5, 1)

    InsertarDataRow("Nodo 2", 6, 0)
    InsertarDataRow("Nodo 2.1", 7, 6)
    InsertarDataRow("Nodo 2.2", 8, 6)

    InsertarDataRow("Nodo 3", 9, 0)
    InsertarDataRow("Nodo 3.1", 10, 9)
    InsertarDataRow("Nodo 3.2", 11, 9)
End Sub

Private Sub InsertarDataRow(ByVal column1 As String, ByVal column2 As Integer, ByVal column3 As Integer)
    Dim nuevaFila As DataRow

    nuevaFila = dataSetArbol.Tables("TablaArbol").NewRow()

    nuevaFila("NombreNodo") = column1
    nuevaFila("IdentificadorNodo") = column2
    nuevaFila("IdentificadorPadre") = column3
    dataSetArbol.Tables("TablaArbol").Rows.Add(nuevaFila)
End Sub
6. En el evento Load de la clase Form1() ingrese la llamada al método que llenará el DataSet. El código quedará como sigue:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    CrearDataSet()
End Sub
7. Finalmente en el evento Click del boton button1 asocie el método siguiente que llamará al método para el llenado del TreeView.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    ' Llamar al método por primera vez que llenará el TreeView, este método se llamará luego
    ' a sí mismo recurrentemente.
    CrearNodosDelPadre(0, Nothing)

End Sub
8. Compila y ejecuta el proyecto.



Si necesitas obtener el IdentificadorNode del Nodo que el usuario selecciona se puede utilizar la propiedad Tag del nodo, por supuesto si previamente en la creación del nodo se almacenó dicho valor en esta propiedad.

Por favor no olvides calificar el artículo en la caja de PanoramaBox que se muestra al inicio de la página, eso te lo agradecería mucho.

Serge Valsse
svalsse@hotmail.com


Espacios de nombres usados en el código de este artículo:

System.Data

 


ir al índice