VB
.NET - Populando o controle TreeView com tabelas e colunas do MS
Access
Para exemplificar a utilização prática do controle TreeView, neste tutorial veremos como popular o controle com todas as tabelas e suas colunas a partir de um banco de dados MS Access usando a linguagem VB .NET.
Abra o Visual Basic 2010 Express Edition e clique em New Project e selecione o template Windows Forms Application informando o nome Tvw_MsAccess e clique em OK;
![]() |
No formulário form1.vb do projeto inclua a partir da ToolBox um controle TreeView (name=tvwDados) e um controle ImageList (name= Imgl);
A seguir no controle ImageList clique na propriedade Images e inclua 3 imagens que serão usadas para diferenciar níveis dos nós do controle TreeView visto que teremos três níveis de nós (nodes) : root, tabelas e colunas
Para isso utilize a janela do Images Collection Editor e clicando no botão Add inclua 3 imagens a seu gosto conforme a figura abaixo:
![]() |
A seguir no controle TreeView atribua à propriedade ImageList o nome Imgl do controle acima;
Vamos incluir também 4 controles controles Buttons, 1 controle Label e um controle OpenFileDialog no formulário fom1.vb :
Conforme o leiaute da figura abaixo:
![]() |
Definindo o código do projeto
1- O namespace usado no formulário para acessar as classes do provedor para o Microsoft Access
Imports System.Data.OleDb
2- Código do evento Click do botão Exibir:
Private Sub btnExibir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibir.Click
Dim arquivoMDB As OpenFileDialog = New OpenFileDialog()
arquivoMDB.InitialDirectory = "c:\dados"
Dim caminho As DialogResult
Dim caminhoArquivo As String
arquivoMDB.Title = "Escolher Arquivo"
arquivoMDB.FileName = "Nome Arquivo"
arquivoMDB.Filter = "Arquivos MsAccess (*.mdb)|*.mdb"
caminho = arquivoMDB.ShowDialog
caminhoArquivo = arquivoMDB.FileName
If caminhoArquivo = Nothing Then
MessageBox.Show("Arquivo Invalido", "Abrir Arquivo", MessageBoxButtons.OK)
Else
popularTreeView(caminhoArquivo)
btnRetrair.Enabled = True
btnExpandir.Enabled = True
End If
End Sub
|
O código define algumas propriedades do controle OpenFIleDialog e chama a rotina popularTreeview passando o caminho do arquivo selecionado.
- InitialDirectory
- Representa o diretório a ser exibido quando a janela de
diálogo aparecer pela primeira vez.
- Title - Usada para definir ou atribuir um
título a janela de diálogo;
- Filter - Representa o filtro da janela de
diálogo que será usado para filtrar o tipo de arquivos a serem
carregados durante a localização.
- FileName - Representa o nome do arquivo
selecionado na janela de diálogo.
O código da rotina popularTreeView() é mostrada a seguir:
Private Sub popularTreeView(ByVal arquivo As String)
Dim strCon As String
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & arquivo & ";User Id=admin;Password=;"
'define os nodes que iremos usar no treeview
Dim NoRaiz As TreeNode = Nothing
Dim NoPrincipal As TreeNode = Nothing
Dim NoFilho As TreeNode = Nothing
'define algumas constanes e variaveis usadas
Dim DataBase As String = arquivo
Dim conexaoMDB As OleDbConnection = Nothing
Dim nomePrincipal As String = String.Empty
Dim nomeFilho As String = String.Empty
Try
'define a string de conexão e abre a conexão com o arquivo escolhido
conexaoMDB = New OleDbConnection(connectionString:=strCon)
conexaoMDB.Open()
'retorna as tabelas do esquema
Dim esquemaTabela As DataTable = conexaoMDB.GetOleDbSchemaTable(schema:=Data.OleDb.OleDbSchemaGuid.Tables, _
restrictions:=New Object() {Nothing, Nothing, Nothing, "Table"})
tvwDados.Nodes.Clear()
'inclui o node raiz
NoRaiz = tvwDados.Nodes.Add(key:="Root", text:=DataBase, imageIndex:=0, selectedImageIndex:=0)
'exibe quantidade de tabelas do banco de dados na label
lblTabelas.Text = esquemaTabela.Rows.Count & " Tabelas no arquivo"
'percorre cada tabela do banco de dados
For contaTabelas As Integer = 0 To esquemaTabela.Rows.Count - 1
'pega o nome da tabela
Dim nomeTabela As String = esquemaTabela.Rows(index:=contaTabelas)!TABLE_NAME.ToString
'verifica se o nome da tabela ja existe na coleção de nós
If nomePrincipal <> nomeTabela Then
NoPrincipal = NoRaiz.Nodes.Add(key:="Table", text:=nomeTabela, imageIndex:=1, selectedImageIndex:=1)
nomePrincipal = nomeTabela
End If
'pega o nome das colunas na tabela
Dim esquemaColuna = conexaoMDB.GetOleDbSchemaTable(schema:=OleDbSchemaGuid.Columns, _
restrictions:=New Object() {Nothing, Nothing, nomeTabela, Nothing})
'inclui cada coluna como um nó filho
For contaColunas As Integer = 0 To esquemaColuna.Rows.Count - 1
nomeFilho = esquemaColuna.Rows(index:=contaColunas)!COLUMN_NAME.ToString
NoFilho = NoPrincipal.Nodes.Add(key:="Column", text:=nomeFilho, imageIndex:=2, selectedImageIndex:=2)
Next
'certifica que o nó seja visível
tvwDados.Nodes(0).EnsureVisible()
Next
Catch ex As Exception
MessageBox.Show("Erro ao realizar a operação com o arquivo : " & ex.Message)
Exit Sub
Finally
'libera os recursos da conexão usada
conexaoMDB.Close()
conexaoMDB.Dispose()
conexaoMDB = Nothing
End Try
End Sub
|
O provedor de dados OLEDB .NET usa o método GetOleDbSchemaTable do objeto OleDbConnection para expor as informações do esquema.
GetOleDbSchemaTable retorna uma DataTable que é preenchida com as informações do esquema.
- O primeiro argumento de GetOleDbSchemaTable é o parâmetro de esquema, um argumento OleDbSchemaGuid que identifica quais informações de esquema para retornar (como tabelas, colunas e chaves primárias).
- O segundo argumento é uma matriz de objeto de restrições para filtrar as linhas que são retornadas no esquema de DataTable (por exemplo, você pode especificar as restrições de nome, tipo, proprietário e/ou esquema da tabela).
OleDbSchemaGuid membros
O argumento OleDbSchemaGuid especifica o tipo do esquema da tabela para o método GetOleDbSchemaTable.
Alguns dos membros OleDbSchemaGuid incluem :
Restrições
As restrições são uma matriz de objeto de valores de filtro, cada um dos quais corresponde a um DataColumn na DataTable resultante. O argumento OleDbSchemaGuid determina as restrições relevantes. Por exemplo, quando você especificar um OleDbSchemaGuid de tabelas, a matriz de restrições será definida assim: {TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE}
Quando você passa valores na matriz de restrição, inclua a palavra-chave Nothing para elementos da matriz que não contêm valores. Por exemplo, se você desejar recuperar esquemas de tabela, use OleDbSchemaGuid.Tables.
No entanto, se você especificar tabelas, isso também retornará aliases, sinônimos, modos de exibição e outros objetos relacionados. Assim, se você desejar filtrar todos os objetos, exceto tabelas, use uma restrição do TABLE para TABLE_TYPE.
Dessa forma você pode usar Nothing para TABLE_CATALOG TABLE_SCHEMA e TABLE_NAME porque você não está filtrando esses objetos.
DataTable retornada
O DataTable que o método GetOleDbSchemaTable retorna possui uma linha para cada objeto que atenda aos critérios de restrição e o tipo OleDbSchemaGuid. O DataTable possui uma coluna para cada uma das colunas restrição, que é seguido por informações adicionais do esquema com base no campo OleDbSchemaGuid.
As colunas que são retornadas no DataTable são as colunas de restrição (TABLE_CATALOG TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE), que são seguidas pelas colunas adicionais do esquema de TABLE_GUID, descrição, TABLE_PROPID, DATE_CREATED e DATE_MODIFIED.
Para obter essa lista de nomes de coluna (ou seja, os campo descritores, como TABLE_CATALOG, TABLE_SCHEMA e TABLE_NAME), você pode usar a posição ordinal das colunas. Observe que a matriz de colunas é baseado em zero.
O código do evento Click do botão Expandir
Private Sub btnExpandir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExpandir.Click
'expande todos os nós
tvwDados.ExpandAll()
End Sub
|
O método ExpandAll() expande todos os nodes.
O código do evento Click do botão Retrair
Private Sub btnRetrair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRetrair.Click
'retrai todos os nós
tvwDados.CollapseAll()
End Sub
|
O método CollapseAll() retrai todos os nodes.
O código do evento Click do botão Sair
Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click
Dim resultado As DialogResult = MessageBox.Show("Deseja encerrar a aplicação ?", _
"Encerrar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If resultado = DialogResult.Yes Then
Application.Exit()
End If
End Sub
|
Executando o projeto ao clicar no botão Exibir teremos a caixa de diálogo Abrir arquivo aberta para selecionarmos o arquivo Access:
![]() |
Após selecionar o arquivo o controle é preenchido com os nomes das tabelas e suas colunas:
![]() |
Para obter o nó selecionado no controle TreeView usamos o evento AfterSelect pois o evento Click do controle retorna apenas o nó anterior selecionado.
No código usamos as propriedades e.Node e SelectedNode para obter o nó selecionado.
Private Sub tvwDados_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvwDados.AfterSelect
'obtem o item selecionado
Dim itemSelecionado As String = tvwDados.SelectedNode.ToString
'remove a string TreeNode
itemSelecionado = itemSelecionado.Replace("TreeNode: ", "")
'verifica se o item é nulo
If (e.Node.Parent IsNot Nothing) Then
'verifica o tipo do no
If (e.Node.Parent.GetType() Is GetType(TreeNode)) Then
If e.Node.Parent.Text = ofd1.FileName Then
'mostra o nome da tabela e da coluna selecionada
MessageBox.Show(e.Node.Parent.Text + "." + itemSelecionado)
Else
'mostra so o nome da tabela
MessageBox.Show(itemSelecionado)
End If
End If
End If
End Sub
|
Executando o projeto e selecionando um nó com o mouse iremos obter :
![]() |
Pegue projeto completo
aqui:
Tvw_MsAccess.zip
Mar 11:24
Por isso vos digo que tudo o que pedirdes em oração, crede que o recebereis, e tê-lo-eis.Referências: