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

nokPT

[Resolvido] Populate TreeView a partir de base de dados em SQL

6 mensagens neste tópico

Bom dia,

Tenho uma tabela em SQL que tem entre outras colunas: Ano, Número, Descrição, ...

Quero popular uma treeview do género:

2008

    - Nº 1

    - Nº 2

2007

   - Nº 1

Como é que faço para verificar se um determinado nó(ano) já existe acrescentar o nó(número) a esse nó, caso contrário criar os 2 nós, neste momento já tenho parte a funcionar (cria sempre os 2 nós) ou seja:

2008

    - Nº 1

2008

    - Nº 2

2007

    - Nº 1

Ou seja, duplica os nós dos anos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra lá o código que tens e um exemplo de como tens a estrutura na base de dados ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes optar por um modo que funciona melhor...e poupa recursos:

Carregas os nós todos...ou seja por exemplo os nós dos anos

-2007

-2008

-2009

... depois no duplo clique de cada um dos nós vai carregar os dados para o ano respectivo

Ou então podes:

das uma instrução de sql a base de dados a buscar os anos:

fazes um ciclo pelos anos... e com uma nova instrução de sql em que o critério é o ano... vais buscar os numeros para o ano.

Um novo ciclo pelos numeros, sendo que a cada iteração, vais adicionar ao nó (ano) os nós números...

mas... diz coisas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom dia,

A minha tabela tem:

Ano | Número | Descrição | ...

2008 | 1 | ... | ...

2008 | 2 | ... | ...

2008 | 3 | ... | ...

2007 | 1 | ... | ...

2006 | 1 | ... | ...

...

Baseado na dica do jpaulino, neste momento estou a usar o seguinte código:

    Private Sub FillTreeView(ByVal ID As Integer, ByVal tvParentNode As TreeNode)
        ' Retirado de: http://www.portugal-a-programar.pt/index.php?showtopic=23457


        Dim connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\CSC-EA\CSC-EA.mdf';" & ";Integrated Security=True;User Instance=True"
        Dim SQL As String = "SELECT Ano, Número FROM [Obras] ORDER BY Ano DESC"

        Using conn As New SqlConnection(connString)
            conn.Open()
            Using command As New SqlCommand(SQL, conn)
                Using reader As SqlDataReader = command.ExecuteReader()
                    If reader.HasRows Then
                        While reader.Read()
                            Dim nodeAno As Integer = reader.Item("Ano")
                            Dim nodeNúmero As Integer = reader.Item("Número")
                            ' Adiciona o novo nó (com uma chave)
                            Dim tvNode As TreeNode
                            If tvParentNode Is Nothing Then
                                tvNode = tvwObras.Nodes.Add("K" & nodeAno, nodeAno)
                            Else
                                If tvParentNode.Text = reader.Item("Ano").ToString Then
                                    tvNode = tvParentNode.Nodes.Add("K" & nodeNúmero, nodeNúmero)
                                Else
                                    tvNode = tvwObras.Nodes.Add("K" & nodeAno, nodeAno)
                                End If
                            End If
                            ' Chama recursivamente a subrotina
                            Call FillTreeView(nodeAno, tvNode)
                        End While
                    End If
                End Using 'reader
            End Using 'command
            conn.Close()
        End Using 'conn
    End Sub

Mas não está a funcionar, cria-me nós até dar time-out ou número de ligações maior que o permitido

Cria sempre o mesmo nó

-2008

    -1

-2008

    -1

-2008

    -1

-2008

    -1

-2008

    -1

...

Ou (se eliminar um if que acrescentei)

-2008

  -1

      -1

        -1

            -1

...

Ou seja, cria sempre o mesmo nó, dá-me a impressão que não evolui na tabela resultado.

Entretanto segui a sugestão do José Lopes:

    
Private Sub RebuildArvore()
        Try
            tvwObras.Nodes.Clear()

            Dim connString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\CSC-EA\CSC-EA.mdf';" & ";Integrated Security=True;User Instance=True"
            Dim strAnoSQL As String = "SELECT DISTINCT Ano FROM Obras ORDER BY Ano DESC"
            Dim dsAno As New DataSet
            Dim anoConn As New SqlConnection(connString)
            Dim daAno As New SqlDataAdapter(strAnoSQL, connString)

            anoConn.Open()
            daAno.Fill(dsAno, "Ano")
            anoConn.Close()
            Me.tvwObras.BeginUpdate()
            For Each RowAno As DataRow In dsAno.Tables("Ano").Rows
                Dim nodeAno As TreeNode
                nodeAno = New TreeNode
                nodeAno.Text = RowAno("Ano").ToString
                tvwObras.Nodes.Add(nodeAno)

                Dim strNúmeroSQL As String = "SELECT Ano, Número FROM Obras WHERE Ano='" & nodeAno.Text & "' ORDER BY Número ASC "
                Dim dsNúmero As New DataSet
                Dim NúmeroConn As New SqlConnection(connString)
                Dim daNúmero As New SqlDataAdapter(strNúmeroSQL, connString)

                NúmeroConn.Open()
                daNúmero.Fill(dsNúmero, "Número")
                NúmeroConn.Close()
                For Each RowNúmero As DataRow In dsNúmero.Tables("Número").Rows
                    Dim nodeNúmero As TreeNode
                    nodeNúmero = New TreeNode
                    nodeNúmero.Text = RowNúmero("Número").ToString
                    nodeAno.Nodes.Add(nodeNúmero)
                Next
            Next
            Me.tvwObras.EndUpdate()
        Catch ex As Exception
            MsgBox("frmObras: Erro #1 -> " + ex.Message)
        End Try
    End Sub

e consegui por a funcionar.

Obrigado a Ambos

Podem fechar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oá,

Não funciona porque a estrutura é diferente e é necessário adequar de acordo com a estrutura da árvore pretendida. Este exemplo é para uma estrutura "normal" na criação de árvores.

Ainda bem que o outro exemplo servia. :)

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