Hola, desde hace un par de días estoy intentando visualizar unos datos de mi BD en modo árbol. El problema que tengo es que no lo consigo. Hasta ahora he seguido este link adaptándolo a mis datos:
http://aspalliance.com/732_Display_H...w_in_ASPNET_20
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>
CODE BEHIND
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