COMO PREENCHER UMA TREEVIEW

PERCIFILHO 05/10/2012 16:06:52
#411391
Boa tarde amigos, alguém poderia me ajudar a preencher uma TreeView da seguinte maneira:
Usando o BD Northwind e a Tabela Customers.
Preciso mostrar os Países (country) e dentro dos Países, as Cidades (city) de cada país, e, dentro das cidades, os clientes (companyname) de cada cidade.
Não estou conseguindo montrar o próximo nível, ou seja mostrar os clientes.

Meu código está assim:

Sub MontaTreeView()
Dim dtbPaises As New DataTable
Dim dtbCidades As New DataTable
Dim dtbClientes As New DataTable
Dim daPaises As OleDbDataAdapter
Dim daCidades As OleDbDataAdapter
Dim daClientes As OleDbDataAdapter
Dim strconn As String = [Ô]Provider = Microsoft.Jet.OleDB.4.0;Data Source=g:\Northwind.mdb[Ô]
Dim conn As OleDbConnection
Dim i As Integer
Dim j As Integer
Dim l As Integer
conn = New OleDbConnection(strconn)
daPaises = New OleDbDataAdapter([Ô]Select Distinct Country From Customers[Ô], conn)
dtbPaises.Clear()
daPaises.Fill(dtbPaises)
For i = 0 To dtbPaises.Rows.Count - 1
TreeView1.Nodes.Add(dtbPaises.Rows(i).Item([Ô]Country[Ô]))
daCidades = New OleDbDataAdapter([Ô]Select Distinct City, Country From Customers[Ô], conn)
dtbCidades.Clear()
daCidades.Fill(dtbCidades)
For j = 0 To dtbCidades.Rows.Count - 1
If dtbPaises.Rows(i).Item([Ô]Country[Ô]) = dtbCidades.Rows(j).Item([Ô]Country[Ô]) Then
TreeView1.Nodes(i).Nodes.Add(dtbCidades.Rows(j).Item([Ô]City[Ô]))
daClientes = New OleDbDataAdapter([Ô]Select CompanyName, City From Customers[Ô], conn)
dtbClientes.Clear()
daClientes.Fill(dtbClientes)
For l = 0 To dtbClientes.Rows.Count - 1
If dtbCidades.Rows(j).Item([Ô]City[Ô]) = dtbClientes.Rows(l).Item([Ô]City[Ô]) Then
TreeView1.Nodes(0).Nodes.Add(dtbClientes.Rows(l).Item([Ô]CompanyName[Ô]))
End If
Next
End If
Next
Next
conn.Close()
End Sub

Por favor, me ajudem para que eu possa aprender a utilizar esse controle, pois ainda não tinha utilizado.

Até mais.
KERPLUNK 05/10/2012 18:14:55
#411409
Amigo, você entende o que este código faz? Se sim, basta acrescentar mais um [Ô]For...Next[Ô] dentro do for...next mais interno que consulta os clientes de acordo com a cidade...
PERCIFILHO 08/10/2012 07:15:37
#411476
Amigo, pois é, eu fiz assim:

daClientes = New OleDbDataAdapter([Ô]Select CompanyName, City From Customers[Ô], conn)
dtbClientes.Clear()
daClientes.Fill(dtbClientes)
For l = 0 To dtbClientes.Rows.Count - 1
If dtbCidades.Rows(j).Item([Ô]City[Ô]) = dtbClientes.Rows(l).Item([Ô]City[Ô]) Then
TreeView1.Nodes(0).Nodes.Add(dtbClientes.Rows(l).Item([Ô]CompanyName[Ô]))
End If
Next

Mas não está aparecendo os clientes. Tem alguma coisa errada nesse For....Next.

Veja como está mostrando na imagem acima.
KERPLUNK 08/10/2012 09:56:48
#411486
Na estrutura e sintaxe de código em si, não tem nada errado, mas me parece que você está selecionando todos os clientes, não de acordo com a cidade... mostre como ficou o código inteiro
PERCIFILHO 08/10/2012 12:21:25
#411509
Eis aqui o código completo:

   Sub MontaTreeView()
Dim dtbPaises As New DataTable
Dim dtbCidades As New DataTable
Dim dtbClientes As New DataTable
Dim daPaises As OleDbDataAdapter
Dim daCidades As OleDbDataAdapter
Dim daClientes As OleDbDataAdapter
Dim strconn As String = [Ô]Provider = Microsoft.Jet.OleDB.4.0;Data Source=g:\Northwind.mdb[Ô]
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim no_paises As New TreeNode
Dim no_cidades As New TreeNode
Dim no_clientes As New TreeNode
Dim dspaises As New DataSet
Dim dscidades As New DataSet
Dim dsclientes As New DataSet
Dim dvpaises As New DataView
Dim dvcidades As New DataView
Dim dvclientes As New DataView
Dim conn As New OleDbConnection(strconn)

daPaises = New OleDbDataAdapter([Ô]Select Distinct Country From Customers[Ô], conn)
daCidades = New OleDbDataAdapter([Ô]Select Distinct City, Country From Customers[Ô], conn)
daClientes = New OleDbDataAdapter([Ô]Select CompanyName, City, Country From Customers[Ô], conn)

daPaises.Fill(dtbPaises)
daCidades.Fill(dtbCidades)
daClientes.Fill(dtbClientes)

For i = 0 To dtbPaises.Rows.Count - 1
TreeView1.Nodes.Add(dtbPaises.Rows(i).Item([Ô]Country[Ô]))
For j = 0 To dtbCidades.Rows.Count - 1
If dtbPaises.Rows(i).Item([Ô]Country[Ô]) = dtbCidades.Rows(j).Item([Ô]Country[Ô]) Then
TreeView1.Nodes(i).Nodes.Add(dtbCidades.Rows(j).Item([Ô]City[Ô]))
For k = 0 To dtbClientes.Rows.Count - 1
If dtbCidades.Rows(j).Item([Ô]City[Ô]) = dtbClientes.Rows(k).Item([Ô]City[Ô]) Then
TreeView1.Nodes(j).Nodes.Add(dtbClientes.Rows(k).Item([Ô]CompanyName[Ô]))
End If
Next
End If
Next
Next
conn.Close()
End Sub
PERCIFILHO 08/10/2012 12:23:08
#411511
Ocorre o seguinte erro:

Specified argument was out of the range of valid values.
Parameter name: index

Nesta linha:

TreeView1.Nodes(j).Nodes.Add(dtbClientes.Rows(k).Item([Ô]CompanyName[Ô]))

Alguém pode me dizer onde estou errando, por favor?

Até mais.
FOXMAN 08/10/2012 12:25:06
#411512
Resposta escolhida
Amigo, de uma olhada nesse exemplo que postei, talvez te ajude.

http://www.vbmania.com.br/pages/index.php?varModulo=Detalhe&varID=8064

o Treeview tem 6 niveis.

PERCIFILHO 08/10/2012 13:47:42
#411526
Estou quase desistindo....
Não consigo fazer.
Deixo o tópico aberto, se alguém mais quiser ajudar.
Vou tomar um cafezinho, minha cabeça está fundindo.

Até mais.
FOXMAN 08/10/2012 15:08:36
#411535
Citação:

:
Estou quase desistindo....
Não consigo fazer.
Deixo o tópico aberto, se alguém mais quiser ajudar.
Vou tomar um cafezinho, minha cabeça está fundindo.

Até mais.



Chegou olhar o exemplo que te postei ????
PERCIFILHO 08/10/2012 16:46:43
#411555
Valeu FoxMan,

O seu exemplo é muito bom.

Consegui, finalmente

Até mais.
Tópico encerrado , respostas não são mais permitidas