Bueno aca te paso un Ejemplo de como llenar tu treeview pero solo lo llena hasta el nivel Nieto
eso quiere decir q dentro del nodo nieto no puede haber nodos
Código vb:
Ver originalDim Con As New SqlConnection("SERVER=(LOCAL);DATABASE=BD;UID=SA;PWD=;")
Dim Adp As SqlDataAdapter
Dim Ds As DataSet
Dim Dt As New DataTable
Dim Dw As New DataView
Dim Nodo As TreeNode
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Si la Conexion esta Abierta entonces la Cierro
If Con.State = 1 Then Con.Close()
' Abro una Nueva Conexion
Con.Open()
Adp = New SqlDataAdapter("Select * From Cuentas", Con) ' Ejecuntando la Consulta
Ds = New DataSet ' Creando un Nuevo Objeto DataSet
Adp.Fill(Ds, "x") ' Llenando el DataSet con el Resultado de la Consulta ' Asignando la Tabla al DataTable
Dw.Table = Ds.Tables("x") ' Asignando al DataView Nuestro DataTable
Dw.RowFilter = "CuentaPadre = '0'" ' Filtrando por El Padre
Dt = Dw.ToTable ' Asignando al DataTable la Tabla Filtrada
With TreeView1
.BeginUpdate() ' Evitando la Actualizacion del Control
Nodo = .Nodes.Add("Plan de Cuentas")
For Each Row As DataRow In Dt.Rows
Nodo.Nodes.Add(Row(0) + " - " + Row(3)) ' Rellenando el Nodo Principal
Dw.Table = Ds.Tables("x")
Dw.RowFilter = "CuentaPadre = '" + Row(0).ToString + "'"
Dt = Dw.ToTable
For Each RowH As DataRow In Dt.Rows
' Agregando el Hijo
Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes.Add(RowH(0) + " - " + RowH(3))
Dw.Table = Ds.Tables("x")
Dw.RowFilter = "CuentaPadre = '" + RowH(0).ToString + "'"
Dt = Dw.ToTable
For Each RowN As DataRow In Dt.Rows
' Agregando el Nieto
Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes(Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes.Count - 1).Nodes.Add(RowN(0) + " - " + RowN(3))
Next
Next
Next
.EndUpdate() ' Actulizando el Control
.AllowDrop = True ' Realizar Drag and Drop
.Sort()
End With
End Sub