Las sentencias a la BD las he provado y en principio funcionan bien.
En mi BD lo que me marca quien es el padre es el campo usu_asoc (string), en caso de estar a blanco indica que ese usuario es padre.
Espero me puedan ayudar a detectar el por qué no funciona. Muchas gracias desde ya.
HTML
Código HTML:
<div id="vista_arbol"> <asp:Label id="lblsuperusuario" Text="Introduce un super usuario" runat="server"></asp:Label><asp:TextBox id="tbsuperusuario" runat="server"></asp:TextBox><br /> <asp:Button id="btnsuperusuario" Text="Crear Tree view" runat="server" OnClick="creartreview" /><br /> <asp:Label id="lblerrorsuperusuario" Text="" runat="server"></asp:Label><br /> <asp:TreeView id="TreeView1" ExpandDepth="0" PopulateNodesFromClient="true" ShowLines="true" ShowExpandCollapse="true" runat="server" /> </div>
Código:
Protected Sub creartreview(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnsuperusuario.Click
Using cnn2 As New SqlConnection(cadenaConexion)
Try
Dim superuser As String = Me.tbsuperusuario.Text
Dim sentenciasuperuser As String = "SELECT usuario, " _
& "(SELECT count(*) FROM usuarios_totales WHERE usuarios_totales.usu_asoc = @superuser AND usuarios_totales.activo = '1') childnodecount " _
& "FROM usuarios_totales" _
& "WHERE usuarios_totales.usuario = @superuser AND usuarios_totales.activo = '1'"
cnn2.Open()
Dim da As New SqlDataAdapter(sentenciasuperuser, cnn2)
da.SelectCommand.Parameters.AddWithValue("@superuser", superuser)
Dim dt As New DataTable
da.Fill(dt)
PopulateNodes(dt, TreeView1.Nodes)
Catch ex0 As SqlException
Me.lblerrorsuperusuario.Text = ex0.Message.ToString()
Catch ex1 As Exception
Me.lblerrorsuperusuario.Text = ex1.Message.ToString()
Finally
Me.lblerrorsuperusuario.Text = "Acabado"
cnn2.Close()
End Try
End Using
End Sub
Protected Sub PopulateNodes(ByVal dt As DataTable, ByVal nodes As TreeNodeCollection)
For Each dr As DataRow In dt.Rows
Dim tn As New TreeNode()
tn.Text = dr("usuario").ToString()
tn.Value = dr("usuario").ToString()
nodes.Add(tn)
'If node has child nodes, then enable on-demand populating
tn.PopulateOnDemand = (CInt(dr("childnodecount")) > 0)
Next
End Sub
Private Sub PopulateSubLevel(ByVal parentid As String, ByVal parentNode As TreeNode)
Using cnn3 As New SqlConnection(cadenaConexion)
Try
Dim sentenciasuperuser2 As String = "SELECT usuario, " _
& "(SELECT count(*) FROM usuarios_totales WHERE usuarios_totales.usu_asoc = @parentid AND usuarios_totales.activo = '1') childnodecount " _
& "FROM usuarios_totales" _
& "WHERE usuarios_totales.usu_asoc = @parentid AND usuarios_totales.activo = '1'"
cnn3.Open()
Dim da As New SqlDataAdapter(sentenciasuperuser2, cnn3)
da.SelectCommand.Parameters.AddWithValue("@parentid", parentid)
Dim dt As New DataTable()
da.Fill(dt)
PopulateNodes(dt, parentNode.ChildNodes)
Catch ex0 As SqlException
Me.lblerrorsuperusuario.Text = ex0.Message.ToString()
Catch ex1 As Exception
Me.lblerrorsuperusuario.Text = ex1.Message.ToString()
Finally
cnn3.Close()
End Try
End Using
End Sub
Protected Sub TreeView1_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodePopulate
PopulateSubLevel(CInt(e.Node.Value), e.Node)
End Sub


