Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Vamos realizar as operaes bsicas de acesso e manuteno de dados via ADO .NET em um banco de dados SQL Server usando os controles
TreeView e DataGridView.
Na verdade os controles sero usados apenas para exibirmos as informaes da tabela Alunos do banco de dados Cadastro.mdf.
Vamos exibir os nomes dos alunos no controle TreeView e os detalhes no controle DataGridView de forma que ao selecionar um nome no controle
TreeView as informaes sero exibidas em controles TextBox no formulrio e estaro prontas para serem atualizadas ou excludas.
um projeto simples que mostra de forma bsica como acessar e realizar as operaes CRUD em uma aplicao C#.
id
nome
email
idade
endereco
ativo
Se voc for usar script acima atente para o fato que o local de criao do banco de dados ser na pasta c:\dados . Portanto voc deve alterar a
pasta para o seu local preferido.
A seguir no formulrio form1.cs inclua os controles : TreeView (tvwAlunos) , DataGridView(gdvDetalhes), 5 TextBox , 1 CheckBox(chkAtivo) e 4
Buttons conforme o leiaute da figura abaixo:
- TextBox :
txtCodigo
http://www.macoratti.net/11/11/c_ctv1.htm 1/8
10/07/2017 C# - CRUD com TreeView e DataGridView
txtNome
txtEndereco
txtEmail
txtIdade
ChkAtivo
- Button :
btnLimpar
btnNovo
btnAtualizar
btnDeletar
Agora vamos definir uma string de conexo no arquivo App.Config. Para criar o arquivo de configurao no menu Project clique em Add New Item
e a seguir selecione o template Application Configuration FIle e aceite o nome padro clicando em Add;
A seguir defina a string de conexo conforme mostra a figura abaixo onde iremos acessar o banco de dados Cadastro.mdf do SQL Server;
Para podermos acessar o arquivo de configurao e obter a string de conexo definida temos que incluir uma referncia a System.Configuration
via menu Project clicando em Add Reference e na tab .NET selecionar o item desejado e clicar em OK;
http://www.macoratti.net/11/11/c_ctv1.htm 2/8
10/07/2017 C# - CRUD com TreeView e DataGridView
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;
Definindo o cdigo
Agora vamos definir o cdigo da aplicao e antes de prosseguir quero deixar claro que:
No estamos adotando as boas prticas neste exemplo e estamos colocando o cdigo na camada de apresentao dessa forma nossa
aplicao ser muito limitada e difcil de estender e manter;
Em outro artigo mostrarei como podemos separar as responsabilidades criando camadas para termos uma aplicao mais robusta;
Definindo a rotina carregaDadosTreeView para carregar o controle TreeView para exibir o nome dos alunos da tabela Alunos:
/// <summary>
/// Carrega dados no TreeView
/// </summary>
private void carregaDadosTreeView()
{
tvwAlunos.Nodes.Clear();
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT nome FROM alunos", conn);
dr = cmd.ExecuteReader();
while (dr.Read())
{
tvwAlunos.Nodes.Add(dr.GetValue(0).ToString());
}
dr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
/// <summary>
/// Carrega dados no GridView
/// </summary>
private void carregaDadosGridView()
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Alunos", conn);
http://www.macoratti.net/11/11/c_ctv1.htm 3/8
10/07/2017 C# - CRUD com TreeView e DataGridView
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
gdvDetalhes.DataSource = ds.Tables[0];
dr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
/// <summary>
/// Vincula os dados no TreeView e GridView
/// </summary>
private void vincula()
{
carregaDadosTreeView();
carregaDadosGridView();
}
/// <summary>
/// Chama a rotina para vincular os dados no
/// TreeView e DataGridView
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
vincula();
}
A rotina carregaDados() usada para exibir os dados do aluno selecionado no controle TreeView nos controles TextBox:
/// <summary>
/// Carrega os dados a partir da tabela Alunos pelo nome
/// </summary>
/// <param name="nome"></param>
private void carregaDados(string nome)
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM alunos where nome = '" + nome +"'" , conn);
dr = cmd.ExecuteReader();
while (dr.Read())
{
txtCodigo.Text = dr["id"].ToString();
txtNome.Text = dr["nome"].ToString();
txtEndereco.Text = dr["endereco"].ToString();
txtEmail.Text = dr["email"].ToString();
txtIdade.Text = dr["idade"].ToString();
chkAtivo.Checked = (Convert.ToBoolean(dr["ativo"]) == true ? true : false);
}
dr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
Cdigo do evento AfterSelect do controle TreeView que chama a rotina carregaDados quando um n do controle for selecionado;
Isso feito obtendo o nome do N selecionado usando o mtodo SelectedNode e chamando a rotina para obter as informao pelo nome obtido:
A varivel incluir definida como false de forma que a incluso no ser possvel at que seu valor seja true;
http://www.macoratti.net/11/11/c_ctv1.htm 4/8
10/07/2017 C# - CRUD com TreeView e DataGridView
/// <summary>
/// Aps selecionar um item no TreeView
/// chama a rotina para preencher os textbox
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvwAlunos_AfterSelect(object sender, TreeViewEventArgs e)
{
incluir = false;
string strNome = this.tvwAlunos.SelectedNode.Text.ToString();
carregaDados(strNome);
}
O cdigo definido acima faz com que quando a aplicao for iniciada os controles TreeView e DataGridView seja preenchidos com os dados da
tabela Alunos conforme mostra a figura abaixo:
Vamos agora definir o cdigo para alterar, incluir e excluir dados da tabela Alunos. Faremos isso diretamente no formulrio usando o evento Click
de cada um dos botes de comando.
Utilizaremos instrues SQL no formato texto , o que no muito aconselhvel por permitir a injeo SQL. O mais indicado seria utilizar stored
procedures , mas mostrarei isso em outro artigo.
SELECT
INSERT INTO
UPDATE SET
DELETE FROM
Estamos usando o mtodo ExecuteNonQuery do objeto Command para executar as instrues SQL. Ele no retorna nenhum registro.
1- Cdigo do evento Click do boto Limpar que chama a rotina limpaControles e pe o foco no controle txtNome:
/// <summary>
/// Limpa os controles TextBox e checkbox
/// do container GroupBox
/// </summary>
private void limpaControles()
{
foreach (Control ctrl in grpAlunos.Controls)
http://www.macoratti.net/11/11/c_ctv1.htm 5/8
10/07/2017 C# - CRUD com TreeView e DataGridView
{
if (ctrl is TextBox)
{
((TextBox)ctrl).Clear();
}
if (ctrl is CheckBox)
{
((CheckBox)ctrl).Checked = false;
}
}
}
2- Cdigo do evento Click do boto Novo que usa a instruo SQL INSERT INTO para incluir dados na tabela Alunos:
/// <summary>
/// Incluir um novo registro na tabela Alunos
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnNovo_Click(object sender, EventArgs e)
{
if (incluir)
{
if ((txtNome.Text != string.Empty) && (txtEmail.Text != string.Empty) && (txtEndereco.Text != string.Empty))
{
try
{
conn.Open();
int valor = chkAtivo.Checked == true ? 1 : 0;
string sql = "Insert Into Alunos Values(" + "'" + txtNome.Text + "','" + txtEmail.Text + "'," + txtIdade.Text + ",'" + txtEndereco.Text + "'," + valor + ");";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Registro includo na tabela Alunos.");
conn.Close();
vincula();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
incluir = false;
}
}
else
{
MessageBox.Show("Valores invlidos.");
}
}
else
{
incluir = false;
MessageBox.Show("Limpe os controles e informe novos valores para incluir um registro.");
}
}
3- Cdigo do evento Click do boto Atualizar que usa a instruo SQL UPDATE SET para incluir dados na tabela Alunos:
/// <summary>
/// Atualiza os dados da tabela Alunos pelo
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAtualizar_Click(object sender, EventArgs e)
{
if ((txtCodigo.Text != string.Empty) && (txtNome.Text != string.Empty))
{
try
{
conn.Open();
int valor = chkAtivo.Checked == true ? 1 : 0;
string sql = "update Alunos set nome = '" + txtNome.Text + "', email = '" + txtEmail.Text + "', idade = " + txtIdade.Text + ", endereco = '" + txtEndereco.Text + "', ativo = " + valor + ";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Registros atualizados na tabela Alunos.");
conn.Close();
vincula();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
else
{
MessageBox.Show("Preencha os dados do Aluno.");
}
}
4- Cdigo do evento Click do boto Deletar que usa a instruo SQL DELETE FROM para excluir dados na tabela Alunos:
/// <summary>
http://www.macoratti.net/11/11/c_ctv1.htm 6/8
10/07/2017 C# - CRUD com TreeView e DataGridView
/// Deleta os registros da tabela alunos pelo cdigo do aluno
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeletar_Click(object sender, EventArgs e)
{
if (txtCodigo.Text != string.Empty)
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("DELETE FROM Alunos WHERE id=" + Convert.ToInt32(txtCodigo.Text) + ";", conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Registro excludo com sucesso.");
conn.Close();
vincula();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
else
{
MessageBox.Show("Informe o cdigo do aluno.");
}
}
Destaques do cdigo:
Estamos usando a instruo try/Catch/Finally para realizar o tratamento de excees nas rotinas. O blocotry-catch-finally usado para envolver
o cdigo onde existe a possibilidade de uma exceo/erro ocorrer. Um blocotry-catch-finally constitudo das seguintes sees :
O operador ternrio esta sendo usado para avaliar se o controle CheckBox esta ou no marcado.
No exemplo, como o campo da tabela para armazenar este valor do tipo bit devemos gravar o valor zero (0) (false) ou um (1) (true).
Para concluir temos o cdigo que usamos para validar a entrada de dados nos controles TextBox do formulrio:
Dessa forma temos uma aplicao simples que permite realizar operaes CRUD em um banco de dados SQL Server. Todo o cdigo foi mostrado e
as orientaes esto detalhadas para voc reproduzir o projeto.
http://www.macoratti.net/11/11/c_ctv1.htm 7/8
10/07/2017 C# - CRUD com TreeView e DataGridView
O projeto completo esta no Super DVD .NET e no Super CD .NET
"E, se algum ouvir as minhas palavras, e no crer, eu no o julgo: porque eu vim, no para julgar o mundo, mas para salvar
o mundo." Joo 12:47
Referncias:
http://www.macoratti.net/11/11/c_ctv1.htm 8/8