Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Utilizando o controlo Treeview

O controlo Treeview permite mostrar diversos nodes (nós) hierarquicamente, como acontece com o explorador do sistema operativo, e com isso permitir ao utilizador uma forma simples de visualizar ou seleccionar qualquer node.

Para adicionar nodes a uma Treeview, pode-se fazer em design time (utilizando o wizard) ou em run-time (utilizando código). Um exemplo simples de adicionar alguns nodes usando código é o seguinte:


    Dim node1 As TreeNode = Me.TreeView1.Nodes.Add("Fruta")
    node1.Nodes.Add("Laranja")
    node1.Nodes.Add("Maça")
    node1.Nodes.Add("Pessego")

    Dim node2 As TreeNode = Me.TreeView1.Nodes.Add("Bebidas")
    node2.Nodes.Add("Whiskey")
    node2.Nodes.Add("Moscatel")
    node2.Nodes.Add("Vodka")

Isto irá adicionar dois nodes principais (“Fruta” e “Bebidas”), e dentro desses nodes, outros subnodes (designado por child nodes). O resultado será o seguinte:

Mas quando se tem mais informação, não se pode inserir todos os nodes desta forma. É preciso guarda a informação em uma base de dados, ou em outro recurso qualquer, sendo necessário primeiro definir uma estrutura que seja adequada.

Este exemplo de estrutura é a forma mais usada e mais prática de o fazer. Um campo “ID” que é a chave-primária e com auto-numeração (Identity), uma campo designado como “dependencia” que irá fazer referência ao “ID” que queremos, e, finalmente, uma campo para a descrição.

Como se pode ver nos dados, os campos que vão aparecer na raiz têm no campo “dependencia” um 0 (zero). Os outros fazem referência ao ID base.

Mas podemos criar mais níveis hierárquicos na árvore, bastando para isso fazer referência a um “ID” qualquer e esse registo será um child node do ID indicado. Neste caso iremos adicionar algumas marcas de Whiskey.

Para finalizar o código!

É fundamental criar um método recursivo, que irá percorrer todos os itens na lista, e preencher a Treeview.

Eis um exemplo de como se pode fazer:


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

  ''' <summary>
  ''' Preenche recursivamente uma Treeview com  
  ''' informação de uma base de dados SQL
  ''' </summary>
  ''' <param name="dependenciaID">ID do node base</param>
  ''' <param name="childNode">Node anterior</param>
  Sub FillTreeViewNodes(ByVal dependenciaID As Integer, ByVal childNode As TreeNode)

    Try

      Dim SQL As String = _
          "SELECT * FROM produtos WHERE dependencia=@id ORDER BY descricao;"

      ' Ligação à base de dados (SQL)
      Using conn As New SqlConnection(connString)
        conn.Open()

        ' Define o comando e o parameter
        Using command As New SqlCommand(SQL, conn)
          command.Parameters.Add("@id", SqlDbType.Int).Value = dependenciaID

          ' Lê os dados para um SqlDataReader
          Using reader As SqlDataReader = command.ExecuteReader()

            ' Caso tenha resultados
            If reader.HasRows Then
              While reader.Read()

                Dim newNode As TreeNode = Nothing
                Dim desc As String = reader.Item("descricao").ToString()
                Dim actualID As Integer = Integer.Parse(reader.Item("ID").ToString())

                ' Verifica se é o primeiro node
                If childNode Is Nothing Then
                  newNode = New TreeNode(desc)
                  Me.TreeView1.Nodes.Add(newNode)
                Else
                  newNode = childNode.Nodes.Add(desc)
                End If

                ' Chama recursivamente o método com o ID actual
                Call FillTreeViewNodes(actualID, newNode)

              End While
            End If

          End Using 'reader

        End Using 'command

      End Using 'conn

    Catch ex As Exception
      Throw New Exception(ex.Message)
    End Try

  End Sub

Finalmente, para chamar o método criado:


    ' Preenche a Treeview, iniciando nos nodes da raiz
    Call FillTreeViewNodes(0, Nothing)

E este será o resultado:

Este artigo pretende mostrar de uma forma simples como preencher uma Treeview, através de uma função recursiva, e como criar uma estrutura numa base de dados para guardar a informação.

Espero que ajude!

12 comentários:

Anónimo disse...

muito boa explicação parabéns

Silvio Delgado disse...

Muito bom.
Com poucos ajustes consegui fazer meu código funcionar.

Obrigado.

Anónimo disse...

Não percebi esta última parte. :(

Jorge Paulino disse...

Que parte?

Rodrigo Nunes de Lucena disse...

cara ficar dando erro aki

newNode = childNode.Nodes.Add(desc)

diz que 'Nodes' is not a member of 'System.Web.Ui.WebControls.TreeNode'.

porque isso acontece cmg?

Jorge Paulino disse...

Olá Rodrigo!

Esta solução é para winforms e não para web (asp.net).

Sérgio B. disse...

Obrigado pela explicação. Muito valiosa. Parabéns.

Anónimo disse...

Boa tarde prof.
Desculpa repetir o mesmo assunto, mas to com dificuldade em resolver a treeview, ja ate alterei a estrutura da tabela, mas não consegui Criar a TreeView, queria pedir ao prof, se possivel criar uma treeview com base na estrutura da tabela abaixo descrita e me passar?
Ja lutei bastante e não consegui resolver a situação, por isso to passando a estrutura da tabela ao prof, se possivel criar com base a minha tabela e me passar.

Abaixo a estrutura da tabela:
CREATE TABLE [dbo].[SubModulo](
[ID_SUBMODULO] [int] IDENTITY(1,1) NOT NULL,
[ID_MODULO] [int] NOT NULL,
[NOME_SUBMODULO] [varchar](50) NOT NULL,
[ACTIVO] [bit] NOT NULL,
CONSTRAINT [PK_SubModulo] PRIMARY KEY CLUSTERED
(

CREATE TABLE [dbo].[FunçoesUser](
[CODIGO_FUNCAO_USER] [int] IDENTITY(1,1) NOT NULL,
[ID_SUBMODULO] [int] NULL,
[NOME_FUNCAO_USER] [varchar](100) NOT NULL,
[INSERIR] [bit] NULL,
[ACTUALIZAR] [bit] NULL,
[ELIMINAR] [bit] NULL,
[CONSULTAR] [bit] NULL,
[IMPRIMIR] [bit] NULL,
[BLOQUEADO] [bit] NOT NULL,
CONSTRAINT [PK_FunçoesUser] PRIMARY KEY CLUSTERED
(

1º - Os SubModulos
2º - As Funçoes pertencentes a cada SubModulo
3º - As opçoes de cada Função (Inserir, Actualizar, Eliminar, Consultar e Imprimir)
Usando: VB.NET, LINQ TO SQL (DantaContext)

Por favor prof.
Obrigado e boa tarde.

Anónimo disse...

danielbeneditorosa@hotmail.com

Tom Silva disse...

Oi amigo da onça,
Vc pensa que a gente é tapado, cara?
Fica passando essa porcaria de código incompleto e com erro.
Onde está o uso do parâmetro 'dependenciaID' na funçao "FillTreeViewNodes"?
Outra, vc está chamando recursivamente a função, assim:
"FillTreeViewNodes(actualID, newNode);"
Preste atenção, camarada, vc está passando um actualID, para a função que usa "dependenciaID", dados totalmente de naturezas diferentes.
Vai tomar no banho, seu.

Jorge Paulino disse...

Obrigado pelo comentário

Pergunta:Onde está o uso do parâmetro 'dependenciaID' na funçao "FillTreeViewNodes"?"
Resposta: command.Parameters.Add("@id", SqlDbType.Int).Value = dependenciaID

Pergunta: "... dados totalmente de naturezas diferentes"
dependenciaID As Integer e Dim actualID As Integer são de natureza diferentes?

Já vi que entende muito de programação (e de educação) e por isso boa sorte ;)

Ass: "amigo da onça"


PS: Claro que todo o código que está neste blog está testado e a funcionar

Raphael disse...

Olá,

Sou iniciante em VB.NET e estou com uma dúvida. Estou criando um programa para minha empresa da seguinte forma:

-Tenho varias maquinas e para elas quero criar uma lista de acoes, principais e secundarias (TreeView)

-No meu Form, em um ComboBox tenho a lista de todas as maquinas, carregadas da Tabela Maquinas do Banco de Dados.

-Ao selecionar a maquina no combobox, quero que no TreeView já mostre todas as tarefas.

-Também tenho um textbox com a tarefa a ser adicionada ao TreeView. Ao clicar no botão adicionar, a tarefa é adicionada exclusivamente para aquela Maquina.

Sabe qual a melhor forma de fazer isso? Preciso criar uma tabela no Banco para cada maquina? (São aprox. 30 maq.)

Atenciosamente,

Raphael



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico