Solución: Usar un método recursivo como se explica a continuación.
Agradezco mucho a estas páginas por guiarme en la manera de llenar un treeview de forma sencilla Llenar un TreeView desde un DataSet usando un método recurrente C#Llenar un TreeView desde un DataSet en VB .NET
Pero como siempre, tuve que cambiar un poco el código para que se adaptara a mis necesidades, por lo que lo resumo aquí.
Mi cambio en sí, es que los datos los traigo de un SP y los lleno en un DataTable y no en un dataSet Ejemplo.
'Variable usada en todos los procesos Private dtTabla As New DataTable 'Creo una nueva tabla 'Creo mi propio proceso para obtener los datos del SP Private Sub CargarArbolTreeView() Dim adapter As New SqlDataAdapter Using connection As SqlConnection = New SqlConnection(args) 'La variable arg contiene la cadena de conexion Dim command As New SqlCommand("sp_ejemplo", connection) 'Llamo al SP command.CommandType = CommandType.StoredProcedure 'Indico que es un SP adapter = New SqlDataAdapter(command) 'Lo cargo al adapter dtTabla = New DataTable 'Creo una nueva tabla Try adapter.Fill(dtTabla) 'Lleno mis datos del SP al dataTable CrearNodosDelPadre(0, Nothing) 'Llamo al proceso que llena el treeview Catch expSQL As SqlException MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception") End Try End Using End Sub
Mi proceso CrearNodosDelPadre es casi igual a lo explicado en las páginas de referencia, solo cambia la manera de utilizar el DataView.
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(dtTabla) 'Filtra por cada padre dataViewHijos.RowFilter = dtTabla.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 'Descripción o texto del nodo nuevoNodo.Text = dataRowCurrent("NombreNodo").ToString().Trim() 'Si necesito guardar el valor del IdentificadorNodo dentro del mismo nodo nuevoNodo.Name = dataRowCurrent("IdentificadorNodo").ToString().Trim() 'Si necesito guardar el valor del IdentificadorPadre dentro del mismo nodo nuevoNodo.Tag = dataRowCurrent("IdentificadorPadre").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
Si falta más explicación detallada, revisar las páginas de referencias que indico al principio.