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