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 [Link].
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 [Link] 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 [Link] ser criado na pasta c:\dados
USE [master]
GO
CREATE DATABASE [Cadastro] ON PRIMARY
( NAME = N'Cadastro', FILENAME = N'c:\dados\[Link]' , 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 [Link] inclua os controles : TreeView (tvwAlunos) , DataGridView(gdvDetalhes), 5 TextBox , 1 CheckBox(chkAtivo) e 4
Buttons conforme o leiaute da figura abaixo:
Controles do formulrio [Link]:
- TextBox :
txtCodigo
[Link] 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 [Link]. 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 [Link] do SQL Server;
Para podermos acessar o arquivo de configurao e obter a string de conexo definida temos que incluir uma referncia a [Link]
via menu Project clicando em Add Reference e na tab .NET selecionar o item desejado e clicar em OK;
[Link] 2/8
10/07/2017 C# - CRUD com TreeView e DataGridView
Temos tambm de definir no formulrio [Link] seguintes namespaces:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
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 = [Link]["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()
{
[Link]();
try
{
[Link]();
SqlCommand cmd = new SqlCommand("SELECT nome FROM alunos", conn);
dr = [Link]();
while ([Link]())
{
[Link]([Link](0).ToString());
}
[Link]();
}
catch (Exception ex)
{
[Link]([Link]());
}
finally
{
[Link]();
}
}
Rotina carregaDadosGridView para carregar os dados da tabela Alunos no controle DataGridView
/// <summary>
/// Carrega dados no GridView
/// </summary>
private void carregaDadosGridView()
{
try
{
[Link]();
SqlCommand cmd = new SqlCommand("SELECT * FROM Alunos", conn);
[Link] 3/8
10/07/2017 C# - CRUD com TreeView e DataGridView
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
[Link](ds);
[Link] = [Link][0];
[Link]();
}
catch (Exception ex)
{
[Link]([Link]());
}
finally
{
[Link]();
}
}
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
{
[Link]();
SqlCommand cmd = new SqlCommand("SELECT * FROM alunos where nome = '" + nome +"'" , conn);
dr = [Link]();
while ([Link]())
{
[Link] = dr["id"].ToString();
[Link] = dr["nome"].ToString();
[Link] = dr["endereco"].ToString();
[Link] = dr["email"].ToString();
[Link] = dr["idade"].ToString();
[Link] = ([Link](dr["ativo"]) == true ? true : false);
}
[Link]();
}
catch (Exception ex)
{
[Link]([Link]());
}
finally
{
[Link]();
}
}
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 = [Link]();
A varivel incluir definida como false de forma que a incluso no ser possvel at que seu valor seja true;
[Link] 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 = [Link]();
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();
[Link]();
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 [Link])
[Link] 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 (([Link] != [Link]) && ([Link] != [Link]) && ([Link] != [Link]))
{
try
{
[Link]();
int valor = [Link] == true ? 1 : 0;
string sql = "Insert Into Alunos Values(" + "'" + [Link] + "','" + [Link] + "'," + [Link] + ",'" + [Link] + "'," + valor + ");";
SqlCommand cmd = new SqlCommand(sql, conn);
[Link]();
[Link]("Registro includo na tabela Alunos.");
[Link]();
vincula();
}
catch (Exception ex)
{
[Link]([Link]());
}
finally
{
[Link]();
incluir = false;
}
}
else
{
[Link]("Valores invlidos.");
}
}
else
{
incluir = false;
[Link]("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 (([Link] != [Link]) && ([Link] != [Link]))
{
try
{
[Link]();
int valor = [Link] == true ? 1 : 0;
string sql = "update Alunos set nome = '" + [Link] + "', email = '" + [Link] + "', idade = " + [Link] + ", endereco = '" + [Link] + "', ativo = " + valor + ";
SqlCommand cmd = new SqlCommand(sql, conn);
[Link]();
[Link]("Registros atualizados na tabela Alunos.");
[Link]();
vincula();
}
catch (Exception ex)
{
[Link]([Link]());
}
finally
{
[Link]();
}
}
else
{
[Link]("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>
[Link] 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 ([Link] != [Link])
{
try
{
[Link]();
SqlCommand cmd = new SqlCommand("DELETE FROM Alunos WHERE id=" + Convert.ToInt32([Link]) + ";", conn);
[Link]();
[Link]("Registro excludo com sucesso.");
[Link]();
vincula();
}
catch (Exception ex)
{
[Link]([Link]());
}
finally
{
[Link]();
}
}
else
{
[Link]("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 = [Link] == 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 ( && [Link] != (char)8)
[Link] = 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 ([Link]([Link]) && [Link] != (char)8)
{
[Link] = true;
}
}
private void txtEndereco_KeyPress(object sender, KeyPressEventArgs e)
{
if ([Link]([Link]) && [Link] != (char)8)
{
[Link] = 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.
[Link] 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 [Link]
Seo C# do site [Link]
Super DVD .NET - A sua porta de entrada na plataforma .NET
Super DVD Vdeo Aulas - Vdeo Aula sobre VB .NET, ASP .NET e C#
[Link] e C-Sharp - Comparando -[Link]
C#- Otimizando o cdigo -[Link]
Comparando [Link] com C#
Previna-se contra aInjeo [Link]
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
[Link] 8/8