Llenar un TreeView de forma recursiva

Problema: Llenar un TreeView con nodos hijos desde una base de datos
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.