Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/07/2011, 01:05
MiGoBi
 
Fecha de Ingreso: mayo-2011
Mensajes: 60
Antigüedad: 13 años
Puntos: 1
Problema para visualizar TreeView

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