C# - Exibindo informações do banco de dados com ListView e TreeView
Este artigo mostra como acessar um banco de dados e exibir as informações das tabelas usando os controles ListView e TreeView.
Neste exemplo eu vou acessar um banco de dados Microsoft Access mas o código pode ser facilmente adaptado para acessar outros bancos de dados como SQL Server, MySQL, FireBird, etc.
Este é um artigo para iniciantes e aborda o acesso a dados, a utilização dos controles ListView e TreeView, a utilização do OpenFileDialog.
Para criar o projeto deste artigo eu vou usar o Visual C# 2010 Express Edition (ele é gratuito).
Abra o Visual C# 2010 Express e crie um novo projeto do tipo Windows Forms Application com o nome acessoDados_TreeView;
Em seguida vamos definir a interface com o usuário no formulário form1.vb conforme o leiaute da figura abaixo:
Os componentes usados a partir da ToolBox foram:
O projeto vai funcionar assim:
A seguir temos a imagem mostrando a tela principal do programa exibindo informações para o banco de dados Northwind.mdb nos controles ListView e TreeView;
No código do projeto eu estou usando dois arrays do tipo ArrayList: tabelaArray : para salvar os nomes das tabelas e camposArray - para salvar os nomes dos campos
As rotinas definidas no código são as seguintes:
Nas rotinas GetTabelas e GetCampos estou usando o método GetOleDbSchemaTable para obter informações do esquema do banco de dados.
Para obter o nomes dos campos estou usando OleDbSchemaGuid, e, os nomes dos campos são retornados ordenados (A-Z)
Definindo o código da aplicação
Vamos agora mostrar passo a passo o código das rotinas criadas no projeto para que a aplicação faça o que foi proposto.
-Namespaces usados no projeto:
using System;
using System.Data;
using System.Windows.Forms;
using System.Collections;
using System.Data.OleDb;
Os namespaces System.Data e System.Data.OleDb devem ser usados para termos acesso as classes ADO .NET e ao provedor OleDb para acesso ao Microsoft Access.
O namespace System.Collections é usado para ter acesso a classe ArrayList.
- Variáveis globais definidas logo após a declaração do formulário form1;
private
OleDbConnection conexaoBD;
private string arquivoDados;
private ArrayList tabelaArray;
private ArrayList camposArray;
- Código definido no evento Load do formulário form1 da aplicação responsável por inicializar os controles TreeView e ListView;
private void Form1_Load(object sender, EventArgs e) { // inicializa o TreeView tvDados.ImageList = imageList1; // inicializa o ListView lvDados.SmallImageList = imageList1; lvDados.Clear(); lvDados.View = View.Details; lvDados.LabelEdit = false; lvDados.FullRowSelect = true; lvDados.GridLines = true; } |
- Código definido no evento Click do botão para selecionar um arquivo que exibe a janela para seleção do arquivo .mdb;
private void btnSelecionaBD_Click(object sender, EventArgs e) { arquivoDados = selecionaArquivoBD("c:\\dados\\"); conexaoDados(arquivoDados); txtBancoDados.Text = arquivoDados; } |
Após selecionar o arquivo será aberta a conexão com o mesmo e definido o seu nome na caixa de texto.
- Código da rotina conexaoDados(arquivoDados) ;
private void conexaoDados(string arquivoDadosBD) { //define a string de conexão usando o provedor Oledb string conexao = @"provider=microsoft.jet.oledb.4.0;Password="""";data source=" + arquivoDadosBD; try { //Inicializa o objeto conexaoBD conexaoBD = new OleDbConnection(conexao); } catch (Exception ex) { MessageBox.Show(ex.Message); } preencherTreeView(); } |
neste código é chamada a rotina preencherTreeView();
- Código da rotina preencherTreeView() que obtém informações sobre as tabelas e os campos exibindo-as no controle TreeView;
private void preencherTreeView() { tvDados.Nodes.Clear(); // define o no raiz para o TreeView. tvDados.Nodes.Add("Database"); tvDados.Nodes[0].ImageIndex = 0; tvDados.Nodes[0].SelectedImageIndex = 0; tvDados.Nodes[0].Tag = "RootDB"; GetTabelas(conexaoBD); // inclui um no tabela for (int i = 0; i < tabelaArray.Count; i++) { tvDados.Nodes[0].Nodes.Add(tabelaArray[i].ToString()); tvDados.Nodes[0].Nodes[i].Tag = "Tabelas"; tvDados.Nodes[0].Nodes[i].ImageIndex = 2; tvDados.Nodes[0].Nodes[i].SelectedImageIndex = 2; } // inclui um no campo for (int i = 0; i < tabelaArray.Count; i++) { GetCampos(conexaoBD, tabelaArray[i].ToString()); for (int j = 0; j < camposArray.Count; j++) { tvDados.Nodes[0].Nodes[i].Nodes.Add(camposArray[j].ToString()); tvDados.Nodes[0].Nodes[i].Nodes[j].Tag = "Campos"; tvDados.Nodes[0].Nodes[i].Nodes[j].ImageIndex = 4; tvDados.Nodes[0].Nodes[i].Nodes[j].SelectedImageIndex = 4; } } } |
Este código usa as rotinas GetTabelas() e GetCampos() para obter informações das tabelas e seus campos.
- Código da rotina GetTabelas() que obtém informação sobre o esquema , no caso o nome das tabelas e preenche o array tabelaArray;
private void GetTabelas(OleDbConnection conBD) { try { //abre a conexão conBD.Open(); //obtem informações do esquema (nome das tabelas do banco de dados) DataTable schTable = conBD.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" }); tabelaArray = new ArrayList(); //preenche o array com o nome das tabelas foreach (DataRow datRow in schTable.Rows) { tabelaArray.Add(datRow["TABLE_NAME"].ToString()); } conBD.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
- Código da rotina GetCampos() que obtém informações sobre os nomes dos campos da tabela e preenche o arraylist camposArray;
private void GetCampos(OleDbConnection conBD, string tabNode) { string tabelaNome; try { tabelaNome = tabNode; //abre a conexão conBD.Open(); //obtem informações do esquema (nome dos campos da tabela) DataTable schTable = conBD.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new Object[] { null, null, tabelaNome }); camposArray = new ArrayList(); //preenche o array com o nome dos campos foreach (DataRow datRow in schTable.Rows) { camposArray.Add(datRow["COLUMN_NAME"].ToString()); } conBD.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
- Código do evento AfterExpand do controle TreeView que é disparado quando o usuário expande um nó Tabela exibindo os dados no ListView;
private void tvDados_AfterExpand(object sender, TreeViewEventArgs e) { string tabelaNome; int contadorCampo; if (e.Node.Tag.ToString() == "RootDB") { e.Node.ImageIndex = 1; e.Node.SelectedImageIndex = 1; } else if (e.Node.Tag.ToString() == "Tabelas") { e.Node.ImageIndex = 3; e.Node.SelectedImageIndex = 3; contadorCampo = e.Node.GetNodeCount(false); // cria o cabeçalho das colunas. int n = lvDados.Width; double largura = n / contadorCampo ; // largura a coluna for (int c = 0; c < contadorCampo; c++) { lvDados.Columns.Add(e.Node.Nodes[c].Text, (int)largura, HorizontalAlignment.Left); } // pega o nome da tabela tabelaNome = e.Node.Text; PreencherListView(conexaoBD, tabelaNome); } } |
Neste evento é chamada a rotina PreencherListView().
- Código da rotina PreencherListView() que exibe as informações da tabela no controle ListView;
private void PreencherListView(OleDbConnection conBD, string nomeTabela) { OleDbCommand cmdBD; OleDbDataReader datReader; string strCampo; //define o nome da tabela txtTabela.Text = nomeTabela; //define uma instrução SQL para obter os dados da tabela strCampo = "SELECT * FROM [" + nomeTabela + "]"; // Inicializa o objeto command cmdBD = new OleDbCommand(strCampo, conBD); //abre a conexão e executa o command conBD.Open(); datReader = cmdBD.ExecuteReader(); // Preenche o ListView while (datReader.Read()) { ListViewItem objListItem = new ListViewItem(datReader.GetValue(0).ToString()); for (int c = 1; c < datReader.FieldCount; c++) { objListItem.SubItems.Add(datReader.GetValue(c).ToString()); } objListItem.ImageIndex = 5; lvDados.Items.Add(objListItem); } //fecha o datareader e a conexao datReader.Close(); conBD.Close(); } |
O código do evento AfterCollapse do TreeView que ocorre antes do Nó é recolhido.
private void tvDados_AfterCollapse(object sender, TreeViewEventArgs e) { if (e.Node.Tag.ToString() == "RootDB") { e.Node.ImageIndex = 0; e.Node.SelectedImageIndex = 0; } else if (e.Node.Tag.ToString() == "Tabelas") { e.Node.ImageIndex = 2; e.Node.SelectedImageIndex = 2; lvDados.Clear(); } } |
O código do evento BeferoExpand do TreeView que ocorre antes que um Nó é expandido;
private void tvDados_BeforeExpand(object sender, TreeViewCancelEventArgs e) { lvDados.Clear(); // expande somente um no for (int i = 0; i < tvDados.Nodes[0].GetNodeCount(false); i++) { tvDados.Nodes[0].Nodes[i].Collapse(); } } |
Finalmente o código do evento Click do item do menu Sair que pergunta ao usuário se ele deseja encerrar:
private void SairMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("Deseja encerrar o programa ?", "Aplicação",MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { Application.Exit(); } } |
Eu sei é apenas C# mas eu gosto...
Pegue o projeto completo aqui: acessoDados_TreeView.zip
C# , Simples, simples assim...
Referências:
José Carlos Macoratti