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

 wellingtonbalbo@gmail.com