• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Anthony

[Resolvido] Treeview categorias e subcategorias , base de dados sql

34 mensagens neste tópico

Encontro-me com um problema   :wallbash:  no qual presiso fazer uma ligação de uma treeview a uma base de dados de sql onde existe uma relaçao de pai e filho Ex:

ID_PAI       N_Filho        T_Descricao

1                      0              Pratos

2                      1              Carnes

3                      1              Peixe

4                      1              Sobremesa

5                      0              Bebidas

6                      4              Gelado

7                      4              Bolo

8                      6             Gelado de chocolate

Onde conseguimos ver que o Id_pai é numeração automatica e o filho é a relação que existe entre a subcategoria e categoria... ficaria mas ou menos assim :

       

        - Pratos

             -Carne

             -Peixe

            - Sobremesa

                     - Gelado

                             -Gelado de chocolate

                      - Bolo

        -Bebidas

Presiso de ajuda a nivel de codigo para a implementação de esto no site vb.asp.net  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Eu utilizo um função recursiva que vai preenchendo a treeview. Eu utilizo um ID, uma dependencia (do ID) e a descrição.

Vê este exemplo:

Imports System.Data
Imports System.Data.SqlClient

Public Class Form1

    Private connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\myDatabase.mdf';Integrated Security=True;User Instance=True"

    ''' <summary>
    ''' Preenche a treeview recursivamente
    ''' </summary>
    Private Sub FillTreeView(ByVal ID As Integer, ByVal tvParentNode As TreeNode)

        Dim SQL As String = "SELECT * FROM myTable WHERE dependencia=@dependencia;"
        Using conn As New SqlConnection(connString)
            conn.Open()

            Using command As New SqlCommand(SQL, conn)

                command.Parameters.Add("@dependencia", SqlDbType.Int).Value = ID
                Using reader As SqlDataReader = command.ExecuteReader()

                    If reader.HasRows Then

                        While reader.Read()

                            Dim nodeID As Integer = reader.Item("ID")
                            Dim nodeDescription As String = reader.Item("descricao").ToString

                            ' Adiciona o novo nó (com uma chave)
                            Dim tvNode As TreeNode
                            If tvParentNode Is Nothing Then
                                tvNode = TreeView1.Nodes.Add("K" & nodeID, nodeDescription)
                            Else
                                tvNode = tvParentNode.Nodes.Add("K" & nodeID, nodeDescription)
                            End If

                            ' Chama recursivamente a subrotina
                            Call FillTreeView(nodeID, tvNode)

                        End While

                    End If

                End Using 'reader

            End Using 'command

        End Using 'conn

    End Sub


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        FillTreeView(0, Nothing)
    End Sub

End Class

Se tiveres dúvidas a implementar, diz!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado pelo codigo fornecido .... pelo k eu comprendi tens um campo ID e outro depenpendia k funcionam igual k o pai e filho ... eu já crie uma nova tabela com os campos ID, dependencia e descricao igual que tu para axim comprender melhor o codigo ..... só que estou a ter problemas com a parte do

                          If tvParentNode Is Nothing Then
                               tvNode = TreeView1.Nodes.Add("K" & nodeID, nodeDescription)
                           Else
                               tvNode = tvParentNode.Nodes.Add("K" & nodeID, nodeDescription)
                           End If

e tanbem com os imports :

Imports System.Data
Imports System.Data.SqlClient

tanbem já meti :
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Web.Configuration

o erro continua na mesma .... Agradecia muito tua ajuda :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é necessário criar uma nova questão  :)

Então qual é mesmo o problema que está a dar ? E os imports o que aconteçe ?

Estás a programar directamente no ficheiro aspx ou no aspx.vb ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

desculpa ...estou a programar directamente no aspx.vb

o erro encontra-se

                        If tvParentNode Is Nothing Then

                                tvNode = TreeView1.Nodes.Add("K" & nodeID, nodeDescription)

                            Else

                                tvNode = tvParentNode.Nodes.Add("K" & nodeID, nodeDescription)

                            End If

e nos imports:

                        Imports System.Data

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

desculpa ...estou a programar directamente no aspx.vb

E dá-te problema nos imports ? Estás a colocar no inicio do documento ?

E o outro erro que mensagem dá ? Tens uma treeview com o nome TreeView1 ?

Verifica também qual é o valor de nodeId e nodeDescription

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim tenho o nome dereito e tambem tenho os imports no inicio

agora de Verifica também qual é o valor de nodeId e nodeDescription?? esa nao comprendi ... ... uma pergunta! existe alguma maneira de eu mandar minha base de dados e meu fixeiro apx e tu implementar ... ? é k  é um trabalho importante e presiso mesmo de fazer categorias e subcategorias sem infinidade !!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A explicação que vou dar pode parecer básica mas eu não sei qual é o teu nível de conhecimento. Se é demasiado básico para ti - desculpa!

Os imports não podem dar erro! Das duas uma: ou tu não estás a colocar os imports no início da folha ou está a programar no ficheiro aspx e não no aspx.vb. O aspx é onde tens as tags, exemplo "<div> </div>"

Quando dá um erro, aparece uma mensagem e a linha fica marcada. Qual é a mensagem de erro ?

Outra coisa, quando compilas o programa aparece-te uma lista de erros. Que erros são ?

Assim é dificil e se quiseres mostrar o teu trabalho, fazes o upload num site tipo rapidshare e metes aqui o link.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao ixu eu poxo garantir-t ... meu nivel nao é assim tao baixo xD!! mais é k tanbem tava a ver esquisito , mais já consegui resolver o problema !!

o problema ta agora na linha   

Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Web.Configuration

Partial Class Utilizador_Bebidas
    Inherits System.Web.UI.Page


    Public Class Form1
        Private connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data';Integrated Security=True;User Instance=True"
        ''<summary>   
        '' Preenche a treeview recursivamente   
        ''</summary>   

        Private Sub FillTreeView(ByVal ID As Integer, ByVal tvParentNode As TreeNode)
            Dim SQL As String = "SELECT * FROM myTable WHERE dependencia=@dependencia;"
            Using conn As New SqlConnection(connString)
                conn.Open()
                Using command As New SqlCommand(SQL, conn)

                    command.Parameters.Add("@dependencia", SqlDbType.Int).Value = ID
                    Using reader As SqlDataReader = command.ExecuteReader()

                        If reader.HasRows Then
                            While reader.Read()

                                Dim nodeID As Integer = reader.Item("ID")
                                Dim nodeDescription As String = reader.Item("descricao").ToString
                                ' Adiciona o novo nó (com uma chave)
                                Dim tvNode As TreeNode
                                If tvParentNode Is Nothing Then
                                    tvNode = TreeView1.Nodes.Add("K" & nodeID, nodeDescription)
                                Else
                                    tvNode = tvParentNode.Nodes.Add("K" & nodeID, nodeDescription)
                                End If
                                ' Chama recursivamente a subrotina
                                Call FillTreeView(nodeID, tvNode)
                            End While
                        End If
                    End Using 'reader
                End Using 'command
            End Using 'conn

        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            FillTreeView(0, Nothing)
        End Sub
    End Class
End Class

Meu problema é k nunca trabalhei com treeview é axo k o problema nao deve estar no nome, mais sim nas propriedades ( é presiso fazer alguma coisa na propriedade da treeview? )

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Presiso de ajuda a nivel de codigo para a implementação de esto no site vb.asp.net  :hmm:

Desculpa ... tens razão, já me esquecia que isto era ASP.NET :)

Dá-me um minuto!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa lá mas esqueci-me que era ASP.NET.

Fica aqui a adaptação

Imports System.Data.SqlClient
Imports System.Data

Partial Class _Default
    Inherits System.Web.UI.Page

    Dim connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and Settings\jpaulino\My Documents\Visual Studio 2008\WebSites\WebSite5\App_Data\myDatabase.mdf';Integrated Security=True;User Instance=True"

    Private Sub FillTreeView(ByVal ID As Integer, ByVal tvParentNode As TreeNode)
        Dim SQL As String = "SELECT * FROM myTable WHERE dependencia=@dependencia;"
        Using conn As New SqlConnection(connString)
            conn.Open()
            Using command As New SqlCommand(SQL, conn)

                command.Parameters.Add("@dependencia", SqlDbType.Int).Value = ID
                Using reader As SqlDataReader = command.ExecuteReader()

                    If reader.HasRows Then
                        While reader.Read()

                            Dim nodeID As Integer = reader.Item("ID")
                            Dim nodeDescription As String = reader.Item("descricao").ToString

                            ' Adiciona o novo nó 
                            Dim tvNode As TreeNode
                            If tvParentNode Is Nothing Then
                                Dim node As New TreeNode
                                With node
                                    .Text = nodeDescription
                                    .Value = nodeID
                                End With
                                TreeView1.Nodes.Add(node)
                                tvNode = node
                            Else
                                Dim node As New TreeNode
                                With node
                                    .Text = nodeDescription
                                    .Value = nodeID
                                End With
                               
                                tvParentNode.ChildNodes.Add(node)
                                tvNode = node
                            End If

                            ' Chama recursivamente a subrotina
                            Call FillTreeView(nodeID, tvNode)

                        End While
                    End If
                End Using 'reader
            End Using 'command
        End Using 'conn

    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            FillTreeView(0, Nothing)
        End If

    End Sub
End Class

No entanto, as connection strings devem ficar no web.config e não no código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

jpaulino,

serial melhor criares a tua função recursiva sem a "criação" constante de conexões à BD.

Fica aqui a adaptação

Imports System.Data.SqlClient
Imports System.Data

Partial Class _Default
    Inherits System.Web.UI.Page

    Private Function OpenConnection() as SqlConnection
      Dim connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and Settings\jpaulino\My Documents\Visual Studio 2008\WebSites\WebSite5\App_Data\myDatabase.mdf';Integrated Security=True;User Instance=True"
      Dim conn As New SqlConnection(connString)
      conn.Open()
      return conn
   end 


    Private Sub FillTreeView(Dim myConn As New SqlConnection , ByVal ID As Integer, ByVal tvParentNode As TreeNode)
        Dim SQL As String = "SELECT * FROM myTable WHERE dependencia=@dependencia;"
               Using command As New SqlCommand(SQL, MyConn)

                command.Parameters.Add("@dependencia", SqlDbType.Int).Value = ID
                Using reader As SqlDataReader = command.ExecuteReader()

                    If reader.HasRows Then
                        While reader.Read()

                            Dim nodeID As Integer = reader.Item("ID")
                            Dim nodeDescription As String = reader.Item("descricao").ToString

                            ' Adiciona o novo nó 
                            Dim tvNode As TreeNode
                            If tvParentNode Is Nothing Then
                                Dim node As New TreeNode
                                With node
                                    .Text = nodeDescription
                                    .Value = nodeID
                                End With
                                TreeView1.Nodes.Add(node)
                                tvNode = node
                            Else
                                Dim node As New TreeNode
                                With node
                                    .Text = nodeDescription
                                    .Value = nodeID
                                End With
                               
                                tvParentNode.ChildNodes.Add(node)
                                tvNode = node
                            End If

                            ' Chama recursivamente a subrotina
                            Call FillTreeView(nodeID, tvNode)

                        End While
                    End If
                End Using 'reader
            End Using 'command
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
           dim   MyConn  as SqlConnection
           Using MyConn= OpenConnection    
                FillTreeView(Myconn,0, Nothing)
          End Using

        End If

    End Sub
End Class

No entanto, as connection strings devem ficar no web.config e não no código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

serial melhor criares a tua função recursiva sem a "criação" constante de conexões à BD.

Sim, foi um exemplo adaptado um pouco "à pressa" e embora o tempo de execução pouco altere, é, obviamente, desnecessário.

No meu exemplo original estou a preencher numa thread porque são mais de 3000 equipamentos ... tem várias alterações e uma delas é que preenche apenas os dois primeiros níveis e guarda a informação do nível na lista. Depois vai preenchendo o resto.

No entanto, as connection strings devem ficar no web.config e não no código.

Foi o que eu também disse :) (foi copy/paste)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas outra vez .. desculpa ontem mais tive que ir !!

            Gostava k me expliques o que:

  ( myConn) já que da erro em tds os myConn e nao comprendo para que funciona !!

Esta treeview ta mesmo dificil de implementar no meu site :S.... presiso mesmo de esta ajuda para minha PAP e nao consigo continuar por causa de fazer minha treeview  infinita !!  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usaste o exemplo alterado que o inginheiiro colocou ?

Mostra lá como está agora.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o ( myConn)  ta como is not declared e ao executar aparece o erro :

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: BC30615: 'End' statement cannot be used in class library projects.

Source Error:

Line 14:        conn.Open()

Line 15:        Return conn

Line 16:        End

Line 17:

Line 18:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Web.Configuration

Partial Class Utilizador_Pratos
    Inherits System.Web.UI.Page



    Private Function OpenConnection() As SqlConnection
        Dim connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='.mdf';Integrated Security=True;User Instance=True"
        Dim conn As New SqlConnection(connString)
        conn.Open()
        Return conn
        End


   Private Sub FillTreeView(Dim myConn As New SqlConnection , ByVal ID As Integer, ByVal tvParentNode As TreeNode)
        Dim SQL As String = "SELECT * FROM myTable WHERE dependencia=@dependencia;"
        Using command As New SqlCommand(SQL, MyConn)

            command.Parameters.Add("@dependencia", SqlDbType.Int).Value = ID
            Using reader As SqlDataReader = command.ExecuteReader()

                If reader.HasRows Then
                    While reader.Read()

                        Dim nodeID As Integer = reader.Item("ID")
                        Dim nodeDescription As String = reader.Item("descricao").ToString

                        ' Adiciona o novo nó 
                        Dim tvNode As TreeNode
                        If tvParentNode Is Nothing Then
                            Dim node As New TreeNode
                            With node
                                .Text = nodeDescription
                                .Value = nodeID
                            End With
                            TreeView1.Nodes.Add(node)
                            tvNode = node
                        Else
                            Dim node As New TreeNode
                            With node
                                .Text = nodeDescription
                                .Value = nodeID
                            End With

                            tvParentNode.ChildNodes.Add(node)
                            tvNode = node
                        End If

                        ' Chama recursivamente a subrotina
                        Call FillTreeView(nodeID, tvNode)

                    End While
                End If
            End Using 'reader
        End Using 'command
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            Dim MyConn As SqlConnection
            Using MyConn = OpenConnection
                FillTreeView(Myconn, 0, Nothing)
            End Using

        End If

    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Faz antes assim:

        Using MyConn As SqlConnection = OpenConnection()
            FillTreeView(MyConn, 0, Nothing)
        End Using

E coloca End Function na função

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

    .....

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            Dim MyConn As SqlConnection
            Using MyConn As SqlConnection = OpenConnection()
                FillTreeView(MyConn, 0, Nothing)
            End Using
        End If

    End Sub
End Class

Continua a dar erros no myconn!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

axo k o erro tá no    Private Sub FillTreeView(Dim myConn As New SqlConnection , ByVal ID As Integer, ByVal tvParentNode As TreeNode)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E por acaso foi assim que eu te mostrei ? Mete exactamente como mostrei.

E ai também não está bem. Tira o New

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Partial Class Utilizador_Pratos
    Inherits System.Web.UI.Page



    Private Function OpenConnection() As SqlConnection
        Dim connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='.mdf';Integrated Security=True;User Instance=True"
        Dim conn As New SqlConnection(connString)
        conn.Open()
        Return conn
    End Function


   Private Sub FillTreeView(Dim myConn As SqlConnection , ByVal ID As Integer, ByVal tvParentNode As TreeNode)
        Dim SQL As String = "SELECT * FROM myTable WHERE dependencia=@dependencia;"
        Using command As New SqlCommand(SQL, MyConn)

            command.Parameters.Add("@dependencia", SqlDbType.Int).Value = ID
            Using reader As SqlDataReader = command.ExecuteReader()

                If reader.HasRows Then
                    While reader.Read()

                        Dim nodeID As Integer = reader.Item("ID")
                        Dim nodeDescription As String = reader.Item("descricao").ToString

                        ' Adiciona o novo nó 
                        Dim tvNode As TreeNode
                        If tvParentNode Is Nothing Then
                            Dim node As New TreeNode
                            With node
                                .Text = nodeDescription
                                .Value = nodeID
                            End With
                            TreeView1.Nodes.Add(node)
                            tvNode = node
                        Else
                            Dim node As New TreeNode
                            With node
                                .Text = nodeDescription
                                .Value = nodeID
                            End With

                            tvParentNode.ChildNodes.Add(node)
                            tvNode = node
                        End If

                        ' Chama recursivamente a subrotina
                        Call FillTreeView(nodeID, tvNode)

                    End While
                End If
            End Using 'reader
        End Using 'command
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Using MyConn As SqlConnection = OpenConnection()
            FillTreeView(MyConn, 0, Nothing)
        End Using

    End Sub
End Class

.....

Tens aqui a ultima alteraçao mais continua a dar erro na linha

Line 19:    Private Sub FillTreeView(Dim myConn As SqlConnection , ByVal ID As Integer, ByVal tvParentNode As TreeNode)

e em todas as MyConn

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora