Você está na página 1de 8

10/07/2017 C# - CRUD com TreeView e DataGridView

C# - CRUD com TreeView e DataGridView

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#.

Definindo o banco de dados e a tabela


O banco de dados Cadastro.mdf e a tabela Alunos podem ser criados diretamente no SQL Server Management Studio com a seguinte estrutura :

A tabela Alunos possui os seguintes


campos:

id
nome
email
idade
endereco
ativo

ou usando o script a seguir:

1- Script para o banco de dados Cadastro.mdf ser criado na pasta c:\dados


USE [master]
GO
CREATE DATABASE [Cadastro] ON PRIMARY
( NAME = N'Cadastro', FILENAME = N'c:\dados\Cadastro.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED,
FILEGROWTH = 1024KB )
LOG ON
( NAME = N'Cadastro_log', FILENAME = N'c:\dados\Cadastro_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB ,
FILEGROWTH = 10%)
GO

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.

2- Script para criar a tabela Alunos


USE [Cadastro]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Alunos](
[id] [int] IDENTITY(1,1) NOT NULL,
[nome] [nvarchar](50) NULL,
[email] [nvarchar](150) NULL,
[idade] [int] NULL,
[endereco] [nvarchar](150) NULL,
[ativo] [bit] NULL,
CONSTRAINT [PK_Alunos] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS =
ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Criando o projeto no Visual C# 2010 Express Edition


Abra o Visual C# 2010 Express Edition e crie um novo projeto no menu File-> New Project escolhendo o template Windows Forms Application
com o nome UsandoTreeView e clique no boto OK;

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:

Controles do formulrio form1.cs:

- 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

Temos tambm de definir no formulrio form1.cs seguintes namespaces:

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 as variveis usadas no projeto no incio do formulrio:

static bool incluir = false;


static string strConexaoSQL = ConfigurationManager.ConnectionStrings["conexaoSQL_Cadastro"].ToString();
SqlDataReader dr;
SqlConnection conn = new SqlConnection(strConexaoSQL);

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();
}
}

Rotina carregaDadosGridView para carregar os dados da tabela Alunos no controle DataGridView

/// <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();
}
}

Rotina Vincula() que chama as duas rotinas acima:

/// <summary>
/// Vincula os dados no TreeView e GridView
/// </summary>
private void vincula()
{
carregaDadosTreeView();
carregaDadosGridView();
}

Cdigo do evento Load do formulrio que chama a rotina vincula():

/// <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:

string strNome = this.tvwAlunos.SelectedNode.Text.ToString();

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:

Realizando a manuteno dos dados

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.

As instrues SQL usadas so:

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:

private void btnLimpar_Click(object sender, EventArgs e)


{
limpaControles();
txtNome.Focus();
incluir = true;
}

Rotina limpaControles() usada para limpar os controles TextBox e CheckBox do formulrio:

/// <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 :

1. O cdigo que pode gerar uma exceo colocando dentro do blocotry


2. Se o erro/exceo ocorrer o blococatchentra em ao e o voc faz o tratamento do erro
3. Dentro do blocofinallyvoc coloca o cdigo que dever ser executado sempre quer ocorra ou no a exceo.

O operador ternrio esta sendo usado para avaliar se o controle CheckBox esta ou no marcado.

int valor = chkAtivo.Checked == true ? 1 : 0;

o "?" funciona como um if :

analisada a primeira parte da sentena;


se o resultado for verdadeiro, utiliza-se a segunda parte; (1)
se for falso, utiliza-se a terceira.(0)

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:

1- Aceita somente nmeros e backspace para a idade : txtIdade

private void txtIdade_KeyPress(object sender, KeyPressEventArgs e)


{
if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
e.Handled = true;
}

1- Aceita somente alfanumricos e backspace para o email e o endereo : txtEmail e txtEndeco

private void txtNome_KeyPress(object sender, KeyPressEventArgs e)


{
if (Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
{
e.Handled = true;
}
}

private void txtEndereco_KeyPress(object sender, KeyPressEventArgs e)


{
if (Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
{
e.Handled = true;
}
}

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:

Seo VB .NET do Site Macoratti.net


Seo C# do site Macoratti.net
Super DVD .NET - A sua porta de entrada na plataforma .NET
Super DVD Vdeo Aulas - Vdeo Aula sobre VB .NET, ASP .NET e C#

VB.NET e C-Sharp - Comparando -Macoratti.net

C#- Otimizando o cdigo -Macoratti.net

Comparando VB.NET com C#

Previna-se contra aInjeo SQL-Macoratti.net

VB .NET - Usando o controle TreeView.

VB. NET - Herana - criando controles herdados -

Usando TreeView na Pratica II -

VB- Exibindo tabelas e registros em um conntrole TreeView.

Jos Carlos Macoratti

http://www.macoratti.net/11/11/c_ctv1.htm 8/8