Neste artigo vamos mostrar como usar o controle TreeView e realizar operações em um banco de dados SQL Server. Vamos realizar as operações CRUD no banco de dados e a seguir os resultados nos controles TreeView e DataGridView. |
O controle TreeView é utilizado para exibir dados de natureza hierárquica tais como organogramas organizacionais, dados hierárquicos, arquivos e diretórios, etc.(O Explorer dá um ideia da aparência do controle quando devidamente configurado).
Ele possui uma estrutura composta por uma árvore de nós (node). (dai o nome tree(árvore) view(visão))
Uma 'árvore'(tree) é constituída por ramificações, que por sua vez são constituídas por muitos 'nós' (node), onde cada nó consiste de uma imagem (configurada através da propriedade Image) e um rótulo (configurado via propriedade Text ). As imagens usadas nos nós(node) são fornecidas pela associação de um componente ImageList com o Controle TreeView. A propriedade ImageList do controle TreeView define o ImageList que contém os objetos Image usados nos nós da árvore.
Um nó(node) pode ser expandido ou retraído, dependendo se possuir ou não nós filhos(child nodes) descendentes. No nível superior ficam as raízes (root nodes) , e cada nó raiz pode ter qualquer quantidade de nós filhos.
As propriedades principais do controle TreeView são Nodes e SelectedNode.
Você pode exibir ícones ao lado de nós. O controle usa imagens do componente ImageList chamado na propriedade de exibição de árvore de ImageList. A propriedade ImageIndex define a imagem padrão para os nós na árvore.
Recursos usados
Objetivos
Aprendizado
Criando o projeto no Visual Studio
Abra o Visual Studio 2012 Express for Windows Desktop e clique em New Project;
Selecione o template Visual C# -> Windows -> Windows Forms Application e informe o nome TreeView_BD e clique em OK;
A seguir vamos incluir os seguintes controles no formulário form1.cs :
Disponha os controles no formulário conforme o leiaute da figura abaixo:
Eu vou usar como exemplo o banco de dados chamado Escola.mdf que foi criado no SQL Server LocalDB e a tabela Usuarios que contém a seguinte estrutura:
A string de conexão esta armazenada no arquivo de configuração App.Config conforme código abaixo:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="EscolaConnectionString"
connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=Escola;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
|
Para podermos acessar o arquivo de configuração App.Config e obter a string de conexão definida temos que incluir uma referência a System.Configuration via menu PROJECT clicando em Add Reference e na tab Assemblies selecione o item System.Configuration e clicar em OK;
Agora podemos definir a implementação do código no formulário form1.cs. Nesta abordagem vou colocar o código no evento dos controles Button, TreeView e DataGridView sendo que a camada de acesso a dados estará sendo chamada diretamente pela interface.
Para ser aderente às boas práticas o correto seria incluir um novo projeto na solução e criar uma camada de acesso a dados. Mas como esse artigo é para novatos estou seguindo o caminho feliz para não complicar.
Exibindo, Incluindo, Alterando e Excluindo dados
Vamos definir os namespaces usados no projeto incluindo no início do formulário o seguinte código:
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
|
Após isso vamos definir duas variáveis que iremos usar no projeto. Logo após a declaração da classe Form1 inclua o código a seguir:
static string strConexaoSQL = ConfigurationManager.ConnectionStrings["EscolaConnectionString"].ToString();
SqlDataReader dr;
SqlConnection conn;
Agora no evento Load do formulário vamos chamar as rotinas VinculaDadosTreeView e VinculaDadosDataGridView para exibir os dados nos controles TreeView e DataGridView:
private void Form1_Load(object sender, EventArgs e)
{
VinculaDadosTreeView();
VinculaDadosDataGridView();
}
|
O código da rotina VinculaDadosTreeView :
private void VinculaDadosTreeView()
{
tvDados.Nodes.Clear();
try
{
conn = new SqlConnection(strConexaoSQL);
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT Usuario FROM Usuarios", conn);
dr = cmd.ExecuteReader();
while (dr.Read())
{
tvDados.Nodes.Add(dr.GetValue(0).ToString());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
dr.Close();
conn.Close();
}
}
|
O código limpa os nós do TreeView e executa um comando SQL na conexão criada para retornar o nome de todos os usuários cadastrados exibindo-os no TreeView usando um DataReader.
O código da rotina VinculaDadosDataGridView
private void VinculaDadosDataGridView()
{
try
{
conn = new SqlConnection(strConexaoSQL);
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Usuarios", conn);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
dgvDados.DataSource = ds.Tables[0];
formataGridView();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
dr.Close();
conn.Close();
}
}
|
Esse código executa um comando SQL na conexão criada para todos os dados de todos os usuários cadastrados exibindo-os no DataGridView usando um DataSet.
A rotina formataGridView() usa as propriedades do DataGridView e formata o controle conforme abaixo:
private void formataGridView()
{
var grd = dgvDados;
grd.AutoGenerateColumns = false;
grd.RowHeadersVisible = false;
grd.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
grd.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
//altera a cor das linhas alternadas no grid
grd.RowsDefaultCellStyle.BackColor = Color.White;
grd.AlternatingRowsDefaultCellStyle.BackColor = Color.Aquamarine;
//altera o nome das colunas
grd.Columns[0].HeaderText = "Código";
grd.Columns[1].HeaderText = "Usuário";
grd.Columns[2].HeaderText = "Senha";
grd.Columns[3].HeaderText = "Email";
//largura colunas
grd.Columns[0].Width = 50;
grd.Columns[1].Width = 150;
grd.Columns[2].Width = 100;
grd.Columns[3].Width = 150;
//seleciona a linha inteira
grd.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
//não permite seleção de multiplas linhas
grd.MultiSelect = false;
// exibe nulos formatados
grd.DefaultCellStyle.NullValue = " - ";
//permite que o texto maior que célula não seja truncado
grd.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
}
|
Estamos usando o evento CellClick do datagridview para exibir os dados da linha selecionada nas caixas de texto do formulário. Veja o código :
private void
dgvDados_CellClick(object sender, DataGridViewCellEventArgs e) { if (dgvDados.Rows[e.RowIndex].Cells[1].Value != null) { string strNome = dgvDados.Rows[e.RowIndex].Cells[1].Value.ToString(); carregaDadosTextBox(strNome); } } |
O código obtém o valor da coluna Nome quando uma célula é clicada e chama a rotina carregaDadosTextBox() passando o nome como argumento.
Usamos também o evento AfterSelect para permitir que quando um usuário clique em um nó do TreeView os dados sejam exibidos nas caixas de texto do formulário. O código esta definido assim:
private void
tvDados_AfterSelect(object sender, TreeViewEventArgs e) { string strNome = this.tvDados.SelectedNode.Text.ToString(); carregaDadosTextBox(strNome); } |
A rotina carregaDadosTextBox() recebe o nome e executa um objeto SqlCommand com uma instrução SQL para obter os dados do usuário para o nome informado. A seguir é criado um DataReader e preenchemos as caixas de texto.
private void carregaDadosTextBox(string nome)
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Usuarios where Usuario = '" + nome + "'", conn);
dr = cmd.ExecuteReader();
while (dr.Read())
{
txtId.Text = dr["Id"].ToString();
txtUsuario.Text = dr["usuario"].ToString();
txtSenha.Text = dr["senha"].ToString();
txtEmail.Text = dr["email"].ToString();
}
dr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
|
Agora vejamos o código de cada um dos botões de comandos do formulário. Em todos eles estamos executando um comando com uma instrução SQL e a seguir executando o método ExecuteNonQuery().
1- Incluir
private void btnIncluir_Click(object sender, EventArgs e)
{
if ((txtId.Text != null) && (txtUsuario.Text != null))
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("Insert Into Usuarios Values('" + txtUsuario.Text + "','" + _
txtSenha.Text + "','" + txtEmail.Text + "');", conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Registros inseridos com sucesso.");
VinculaDadosTreeView();
VinculaDadosDataGridView();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
else
{
MessageBox.Show("Preencha os campos em branco");
}
}
|
2- Alterar
private void btnAlterar_Click(object sender, EventArgs e)
{
if ((txtId.Text != null) && (txtUsuario.Text != null))
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("Update Usuarios Set usuario='" + txtUsuario.Text + "', senha=" + _
txtSenha.Text + " WHERE Id=" + txtId.Text + ";", conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Registros atualizados com sucesso.");
VinculaDadosTreeView();
VinculaDadosDataGridView();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
else
{
MessageBox.Show("Preencha os campos em branco.");
}
}
|
3- Excluir
private void btnExcluir_Click(object sender, EventArgs e)
{
if ((txtId.Text != null) && (txtUsuario.Text != null))
{
if (MessageBox.Show("Deseja excluir o registro selecionado ? ", "Excluir", MessageBoxButtons.YesNo,_
MessageBoxIcon.Information) == DialogResult.Yes )
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("DELETE FROM Usuarios WHERE Id=" + txtId.Text + ";", conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Registro excluído com sucesso.");
btnLimpar.PerformClick();
VinculaDadosTreeView();
VinculaDadosDataGridView();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
}
else
{
MessageBox.Show("Preencha os campos em branco.");
}
}
|
Neste código, após executar a exclusão chamamos o evento Click do botão de comando btnLimpar via método PerformClick() para limpar o formulário.
4- Limpar
private void
btnLimpar_Click(object sender, EventArgs e) { foreach (Control gb in this.Controls) { if (gb is GroupBox) { foreach (Control tb in gb.Controls) { if (tb is TextBox) { tb.Text = ""; } } } } txtUsuario.Focus(); } |
Este código percorre todos os controles do controle GroupBox e verifica se o mesmo é um TextBox sendo que neste caso a propriedade Text é alterada para vazia.
5- Sair
private void btnSair_Click(object sender, EventArgs e)
{
this.Close();
}
|
Executando o projeto e executando algumas operações teremos o seguinte resultado:
O projeto funciona mas precisa das seguintes melhorias que ficam como um exercício:
Pegue o projeto completo aqui : TreeView_BD.zip
Tito 3:3 Porque também nós éramos outrora insensatos, desobedientes, extraviados, servindo a várias paixões e deleites, vivendo em malícia e inveja odiosos e odiando-nos uns aos outros.
Tito 3:4 Mas quando apareceu a bondade de Deus, nosso Salvador e o seu amor para com os homens,
Tito 3:5 não em virtude de obras de justiça que nós houvéssemos feito, mas segundo a sua misericórdia, nos salvou mediante o lavar da regeneração e renovação pelo Espírito Santo,
Tito 3:6 que ele derramou abundantemente sobre nós por Jesus Cristo, nosso Salvador;
Tito 3:7 para que, sendo justificados pela sua graça, fôssemos feitos herdeiros segundo a esperança da vida eterna.
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
|
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#