Olá pessoal, na terceira e última parte de nosso artigo vamos codificar todas as telas fazendo o cadastro, alteração, deleção e consulta dos dados. Como feito no artigo anterior, ao final deste será disponibilizado o download final do código-fonte. Acompanhem:
Pensando nos formulários filhos vamos esquecer os formulários pais e focar nos filhos. Dito isto, abra o frmCadastrarClientes e arraste pra ele o controle do tipo ErrorProvider, altere o ID do controle para epErro e a propriedade BlinkStyle para NeverBlink. Este controle será responsável por fazer a validação dos dados. Ainda no modo Design, clique na SmartTag do ddlEstado e clique em Edit Items (iremos criar alguns estados para usarmos em nosso Insert). Nele adicione os seguintes estados: SP, RJ, MG, RS e MT (um por linha).
Agora crie a conexão com nosso banco, abrindo o Server Explorer (CTRL + W + L), clicando com o botão direito em Data Connections e clicando em Add Connection. Na janela que surge, clique em Microsoft SQL Server e clique em Continue.
Na próxima janela, escolha o servidor, o database, teste a conexão e clique em OK.
Obs: para entender mais sobre os conceitos de ADO.NET e conexão ao banco de dados, sugiro que leia estes artigos e estes.
Feito isso, dê dois cliques no botão Gravar Dados, nele chame o método Gravar(), que será criado logo abaixo (antes declare o namespace System.Data.SqlClient):
private void Gravar()
{
//Crio uma variável booleana que irá verificar se os campos estão validados
bool camposValidados = false;
try
{
//Instancio a classe de conexão passando como parâmetro a string de conexão ao DataBase LibrarySystem
SqlConnection objConexao = new SqlConnection(@"Data Source=WELLINGTON-PC\SQLEXPRESS;
Initial Catalog=LibrarySystem;Integrated Security=True");
//Armazeno em uma variável do tipo string minha instrução SQL referente à inserção do registro,
//concatenando os valores parametrizados, referentes aos campos que serão preenchidos no form
string strConn = @"INSERT INTO Clientes (Nome_Cliente, Endereco_Cliente, Cidade_Cliente, Estado_Cliente," +
"Telefone_Cliente, Status_Cliente) VALUES (@Nome, @Endereco, @Cidade, @Estado, @Telefone, @Status)";
//Uso o objeto instanciado passando como parâmetro a string criada anteriomente e o objeto de conexão ao banco
SqlCommand objCommand = new SqlCommand(strConn, objConexao);
#region Validações dos Campos
//Faço a verificação: se os campos do form estiverem diferentes de nulos uso o método AddWithValue passando como parâmetro
//o Value parametrizado do Insert acima. Se os campos estiverem vazios, chamo o ErrorProvider disparando o erro ao usuário
//Nome
if (!String.IsNullOrEmpty(txtNome.Text))
{
objCommand.Parameters.AddWithValue("@Nome", txtNome.Text);
camposValidados = true;
}
else
{
epErro.SetError(txtNome, "O campo Nome é obrigatório!");
camposValidados = false;
}
//Endereço
if (!String.IsNullOrEmpty(txtEndereco.Text))
{
objCommand.Parameters.AddWithValue("@Endereco", txtEndereco.Text);
camposValidados = true;
}
else
{
epErro.SetError(txtEndereco, "O campo Endereço é obrigatório!");
camposValidados = false;
}
//Cidade
if (!String.IsNullOrEmpty(txtCidade.Text))
{
objCommand.Parameters.AddWithValue("@Cidade", txtCidade.Text);
camposValidados = true;
}
else
{
epErro.SetError(txtCidade, "O campo Cidade é obrigatório!");
camposValidados = false;
}
//Status
if (rbtAtivo.Checked)
{
objCommand.Parameters.AddWithValue("@Status", "A");
camposValidados = true;
}
else
{
objCommand.Parameters.AddWithValue("@Status", "I");
camposValidados = true;
}
//Telefone
if (!String.IsNullOrEmpty(mtbTelefone.Text))
{
objCommand.Parameters.AddWithValue("@Telefone", mtbTelefone.Text);
camposValidados = true;
}
//Estado
if (ddlEstado.SelectedIndex > -1)
{
objCommand.Parameters.AddWithValue("@Estado", ddlEstado.SelectedItem);
camposValidados = true;
}
else
{
epErro.SetError(ddlEstado, "O campo Estado é obrigatório!");
camposValidados = false;
}
#endregion
//Verifico se o retorno de minha variável camposValidados é true
if (camposValidados)
{
//Abro a conexão
objConexao.Open();
//Uso o método ExecuteNonQuery para executar os comandos e realizar o Insert no banco
objCommand.ExecuteNonQuery();
//Fecho a conexão
objConexao.Close();
//Exibo a mensagem ao usuário de confirmação da inserção no banco
MessageBox.Show("Registro inserido com sucesso!", "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Information);
//Chamo o método para limpar os campos e dou o foco ao txtNome
LimparCampos();
txtNome.Focus();
//Habilito o botão Voltar para o usuário
tsbtnVoltar.Enabled = true;
}
else
{
//Exibo a mensagem ao usuário de erro
MessageBox.Show("Ops, ocorreram erros!\n\nPreencha os campos e tente novamente",
"Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Note no código acima que apenas validei se o campo Telefone contém algo digitado, se conter é gravado no banco, senão não faço nada, já que o mesmo foi definido na modelagem dos dados (parte 1) que aceita valores nulos.
Rode a aplicação, grave um registro como teste e verifique se aparece a seguinte mensagem:
Seguindo esta linha de raciocínio, faça o mesmo com os Cadastros de Funcionários e Livros.
Nas codificações das Consultas vamos o conceito de DataSet Tipado. Então, vá a Solution Explorer (CTRL + W + S), clique com o botão direito na solução e clique em Add > New Item. Em Categories, escolha Data e, em Templates, escolha o DataSet. Dê o nome dsLibrarySystem a ele e clique em OK.
Com o DataSet aberto, vá no Server Explorer (CTRL + W + L), abra o seu banco e arraste as 3 tabelas para ele. Para o DataSet de Clientes, teremos 4 tipos de consultas, cada uma com sua filtragem respectiva, para o Nome, para a Cidade, para o Status Ativo e para o Status Inativo.
Dito isto, clique com o botão direito em cima do método já criado automaticamente Fill,GetData (), do ClientesTableAdapter e clique em Configure. Será aberto o Wizard para alterarmos nossa consulta (da mesma forma que fiz em outros artigos, como o Consultório em Windows Forms), na tela que surge, será mostrada a instrução SQL padrão de nosso DataSet. Altere esta instrução para o da imagem a seguir:

Clique em Advanced Options e desmarque todas as opções, já que não precisamos que seja gerado automaticamente as instruções de Insert, Update e Delete.
Adicione mais 3 query’s, só alterando o parâmetro, para @Cidade, @Ativo e @Inativo, respectivamente. Aproveitando faça o mesmo com os DataSet’s de Funcionarios e Clientes. Seu DataSet deverá ter esse aspecto final:
Adicione também, em cada DataSet, uma query padrão, com um SELECT * FROM de cada tabela, a usaremos mais a frente nos forms de Alteração/Exclusão.
Com o código-fonte criado, abra a página de códigos do frmConsultarClientes. Nela, primeiro declare o DataSet que iremos usar:
using LibrarySystem.dsLibrarySystemTableAdapters;
Agora sim, crie o método Consultar, que terá a seguinte codificação (acompanhe os comentários):
private void Consultar()
{
try
{
//Instancio o DataTable e TableAdapter de Clientes
dsLibrarySystem.ClientesDataTable objClientesDataTable = new dsLibrarySystem.ClientesDataTable();
ClientesTableAdapter objClientesTableAdapter = new ClientesTableAdapter();
//Verifico qual RadioButton o usuário checou e se o txtConsulta não está vazio para chamar o respectivo método
if (rbtNome.Checked && !String.IsNullOrEmpty(txtConsulta.Text))
{
//Preencho o TableAdapter com o método FillByNome, passando o DataTable e o txtConsulta como parâmetros
objClientesTableAdapter.FillByNome(objClientesDataTable, "%" + txtConsulta.Text + "%");
//Limpo os dados do meu ListView
lsvDados.Items.Clear();
//Uso o laço foreach para percorrer as linhas do ClientesDataTable e carregá-las em meu ListView
foreach (DataRow objDataRow in objClientesDataTable.Rows)
{
//Instancio a classe ListViewItem e vou adicionando o item e subitens
ListViewItem objListViewItem = new ListViewItem();
objListViewItem.Text = objDataRow[0].ToString();
objListViewItem.SubItems.Add(objDataRow[1].ToString());
objListViewItem.SubItems.Add(objDataRow[2].ToString());
objListViewItem.SubItems.Add(objDataRow[3].ToString());
objListViewItem.SubItems.Add(objDataRow[4].ToString());
objListViewItem.SubItems.Add(objDataRow[5].ToString());
if (objDataRow[6].ToString() == "A")
{
objListViewItem.SubItems.Add("Ativo");
}
else
{
objListViewItem.SubItems.Add("Inativo");
}
//No final adiciono os itens em meu ListView, passando como parâmetro o objListViewItem carregado
lsvDados.Items.Add(objListViewItem);
}
}
else if (rbtCidade.Checked && !String.IsNullOrEmpty(txtConsulta.Text))
{
//Preencho o TableAdapter com o método FillByCidade, passando o DataTable e o txtConsulta como parâmetros
objClientesTableAdapter.FillByCidade(objClientesDataTable, "%" + txtConsulta.Text + "%");
//Limpo os dados do meu ListView
lsvDados.Items.Clear();
//Uso o laço foreach para percorrer as linhas do ClientesDataTable e carregá-las em meu ListView
foreach (DataRow objDataRow in objClientesDataTable.Rows)
{
//Instancio a classe ListViewItem e vou adicionando o item e subitens
ListViewItem objListViewItem = new ListViewItem();
objListViewItem.Text = objDataRow[0].ToString();
objListViewItem.SubItems.Add(objDataRow[1].ToString());
objListViewItem.SubItems.Add(objDataRow[2].ToString());
objListViewItem.SubItems.Add(objDataRow[3].ToString());
objListViewItem.SubItems.Add(objDataRow[4].ToString());
objListViewItem.SubItems.Add(objDataRow[5].ToString());
if (objDataRow[6].ToString() == "A")
{
objListViewItem.SubItems.Add("Ativo");
}
else
{
objListViewItem.SubItems.Add("Inativo");
}
//No final adiciono os itens em meu ListView, passando como parâmetro o objListViewItem carregado
lsvDados.Items.Add(objListViewItem);
}
}
else if (rbtStatus.Checked && rbtAtivo.Checked)
{
//Preencho o TableAdapter com o método FillByAtivo, passando o DataTable como parâmetro
objClientesTableAdapter.FillByAtivo(objClientesDataTable);
//Limpo os dados do meu ListView
lsvDados.Items.Clear();
//Uso o laço foreach para percorrer as linhas do ClientesDataTable e carregá-las em meu ListView
foreach (DataRow objDataRow in objClientesDataTable.Rows)
{
//Instancio a classe ListViewItem e vou adicionando o item e subitens
ListViewItem objListViewItem = new ListViewItem();
objListViewItem.Text = objDataRow[0].ToString();
objListViewItem.SubItems.Add(objDataRow[1].ToString());
objListViewItem.SubItems.Add(objDataRow[2].ToString());
objListViewItem.SubItems.Add(objDataRow[3].ToString());
objListViewItem.SubItems.Add(objDataRow[4].ToString());
objListViewItem.SubItems.Add(objDataRow[5].ToString());
objListViewItem.SubItems.Add("Ativo");
//No final adiciono os itens em meu ListView, passando como parâmetro o objListViewItem carregado
lsvDados.Items.Add(objListViewItem);
}
}
else
{
//Preencho o TableAdapter com o método FillByInativo, passando o DataTable como parâmetro
objClientesTableAdapter.FillByInatvo(objClientesDataTable);
//Limpo os dados do meu ListView
lsvDados.Items.Clear();
//Uso o laço foreach para percorrer as linhas do ClientesDataTable e carregá-las em meu ListView
foreach (DataRow objDataRow in objClientesDataTable.Rows)
{
//Instancio a classe ListViewItem e vou adicionando o item e subitens
ListViewItem objListViewItem = new ListViewItem();
objListViewItem.Text = objDataRow[0].ToString();
objListViewItem.SubItems.Add(objDataRow[1].ToString());
objListViewItem.SubItems.Add(objDataRow[2].ToString());
objListViewItem.SubItems.Add(objDataRow[3].ToString());
objListViewItem.SubItems.Add(objDataRow[4].ToString());
objListViewItem.SubItems.Add(objDataRow[5].ToString());
objListViewItem.SubItems.Add("Inativo");
//No final adiciono os itens em meu ListView, passando como parâmetro o objListViewItem carregado
lsvDados.Items.Add(objListViewItem);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Os códigos ficaram um pouco grandes, mais estão bem simples e explicativos.
Siga esta lógica dos códigos com o forms de Consulta de Funcionários e Livros.
Criei a codificação de alguns eventos dos controles, não mostrarei os mesmos aqui por serem bem simples e com o intuito de não deixar o artigo extenso.
Lembrando: o código-fonte completo estará disponível para download ao final do artigo.
Para terminar nosso artigo, ficou faltando os forms de Alteração/Exclusão. Então vamos a eles. Abra o frmAlterarExcluirClientes. Farei uma correção, no final da parte 2 do artigo, disse-lhes para adicionar as colunas referentes aos campos do Grid, mais não precisaremos fazer isso. Dito isto, clique na SmartTag, clique em Edit Columns, remova as colunas referentes aos campos da tabela Clientes e só deixe os botões Editar e Excluir. Clique em OK, volte a SmartTag, clique em Choose Data Source, para escolher a fonte de dados do GridView, clique em Other Data Sources > Project Data Sources > dsLibrarySystem > Clientes, como a imagem abaixo ilustra:

Finalizando o layout de nosso Grid, clique novamente em Edit Columns, altere o nome das colunas na propriedade Header Text, e altere para False a propriedade Visible da coluna Id_Cliente. Outra coisa que deixei de falar na parte anterior do artigo: ainda no Edit Columns, altere a propriedade, dos botões Editar e Excluir, UseColumnTextForButtonValue para True, para que sejam exibidos o nome dos botões no Grid.
Obs: Com a intenção de não deixar o artigo muito extenso os próximos códigos estarão em imagens.
Vá à página de códigos e crie as variáveis abaixo, que serão públicas em nossa página, responsáveis por armazenar os valores de cada célula referente à linha selecionada no grid:
Agora clique no GridView, aperte F4, vá a janela de eventos do grid e dê dois cliques no evento CellMouseClick, que captura o clique do mouse do usuário no grid. Nele, insira o seguinte código para já capturarmos se o usuário clicou em Editar ou Excluir:
Veja nas imagens a seguir os códigos dos métodos Editar e Excluir:
Simples né? Perceba que para excluir faço direto nesta página. Lembra que no final da parte anterior, citei que talvez precisássemos criar um novo form para Editar? Então, é isso que iremos fazer. Crie o form e o deixe com as propriedades parecidas com os forms padrões de Cadastro, ele deverá ficar como na imagem a seguir:
A idéia é a seguinte: quando o usuário clica no botão Editar do Grid é armazenado nas variáveis públicas que criamos anteriormente os valores das colunas do Grid. O que iremos fazer é “transportar” esses valores para preencher os campos desse form que acabamos de criar.
Boa parte disso foi feito em nosso form, no método EditarRegistro, repare que agora só precisamos ir em nosso form recém-criado e criar as mesmas variáveis públicas do form anterior para, assim, nosso novo form já ter os valores do form anterior. Complexo? Não né!
Para não perdemos tempo, exibo abaixo as imagens dos métodos importantes desse form, o AlterarDados e CarregarDados (que é chamado no evento Load do form), o primeiro responsável por realizar o UPDATE no banco (método praticamente igual ao de gravar clientes) e o segundo responsável por exibir os valores preenchidos nos controles, como você viu na imagem acima:
Ainda temos em nossa página os métodos CancelarAlteracoes e o LimparCampos, que são iguais aos métodos do frmCadastrarClientes. Agora é só replicar estes códigos nos forms de Livros e Funcionários.
Então é isso, assim terminamos nosso CRUD, fazendo as 4 operações completas em nosso form. Todo o código-fonte desse projeto (com comentários) está disponível neste artigo
Assim finalizo o artigo. Muito obrigado a todos!
Um abraço, e até o próximo artigo
Wellington Balbo de Camargo