Banco de Dados

22 jan, 2018

C# – CRUD no SQL Server com Dapper e MetroFramework usando um WebService – Parte 03

Publicidade

Continuando a segunda parte do artigo sobre CRUD no SQL Server com Dapper e MetroFramework, vamos consumir o nosso web service em nosso projeto Windows Forms.

Recursos Usados:

Consumindo o Web Service: incluindo a referência ao Web Service

Antes de prosseguir, você deve abrir o web service em uma navegador para obter o seu endereço URL.

Agora selecione e abra o projeto CRUD_Dapper, clique com o botão direito do mouse sobre o projeto, e a seguir clique em Add -> Service Reference;

Na janela Add Service Reference, copie e cole o endereço de atendimento do web service e clique em Go:

Altere o nome em Namespace para CRUDService e clique no botão OK.

No menu Build clique em Rebuild Solution.

Você deverá visualizar no projeto Windows Forms a referência ao serviço conforme mostra a figura abaixo:

Vamos implementar o código para consumir o web service.

Consumindo o Web Service: implementando o código para consumir o web service

Abra o formulário Form1.cs e defina os seguintes namespaces:

using CRUD_Dapper.CRUDService;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

Note a referência ao namespace CRUDService que faz referência ao nosso web service.

1 – Código do evento Load do formulário

 private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                FuncionariosServiceSoapClient funci = new FuncionariosServiceSoapClient();
                funcionarioBindingSource.DataSource = funci.GetAll();
                pContainer.Enabled = false;
                Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                if (ofunci != null)
                {
                    if (!string.IsNullOrEmpty(ofunci.ImagemUrl))
                        picFoto.Image = Image.FromFile(ofunci.ImagemUrl);
                }
            }
            catch(Exception ex)
            {
                MetroFramework.MetroMessageBox.Show(this, ex.Message,"Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

A classe FuncionariosServiceSoapClient representa uma instância do nosso serviço permitindo o acesso aos métodos definidos no mesmo. No código, chamamos o método GetAll() do webservice para retornar os funcionários.

2 – No evento Click do botão Procurar temos o código que permite selecionar uma imagem e exibir no PictureBox – picFoto usando o OpenFileDialog:

private void btnProcurar_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "JPEG|*.jpg|PNG|*.png", ValidateNames = true })
            {
                if(ofd.ShowDialog() == DialogResult.OK)
                {
                    picFoto.Image = Image.FromFile(ofd.FileName);
                    Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                    if (ofunci != null)
                        ofunci.ImagemUrl = ofd.FileName;
                }
            }
        }

3 – Código do evento CellClick do MetroGrid. Ocorre quando o usuário clica em uma célula do Grid e exibe os dados no Formulário:

 private void gdAlunos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                if (ofunci != null)
                {
                    if (!string.IsNullOrEmpty(ofunci.ImagemUrl))
                        picFoto.Image = Image.FromFile(ofunci.ImagemUrl);
                }
            }
            catch(Exception ex)
            {
                MetroFramework.MetroMessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

4 – Código do botão Deletar onde invocamos o método Delete() do web service para excluir o funcionário selecionado pelo seu ID.

 private void btnDeletar_Click(object sender, EventArgs e)
        {
            oStatus = EntityState.Deleted;
            if (MetroFramework.MetroMessageBox.Show(this, "Tem certeza que deseja Excluir este registro", "Excluir ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                try
                {
                    Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                    if (ofunci != null)
                    {
                        Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                        if (ofunci != null)
                        {
                           FuncionariosServiceSoapClient funci = new FuncionariosServiceSoapClient();
                           bool resultado = funci.Delete(ofunci.FuncionarioID);
                            if (resultado)
                            {
                                funcionarioBindingSource.RemoveCurrent();
                                pContainer.Enabled = false;
                                picFoto.Image = null;
                                oStatus = EntityState.Unchanged;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MetroFramework.MetroMessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

5 – Código do botão Editar, definindo a operação como Changed (alteração), habilitando o Panel (pContainer) e colocando o foco na caixa de texto para informar o nome:

 private void btnEditar_Click(object sender, EventArgs e)
    {
            oStatus = EntityState.Changed;
            pContainer.Enabled = true;
            txtNome.Focus();
    }

A alteração será efetivada quando o botão Salvar for clicado.

6 – Código do botão Cancelar habilitando o Panel (pContainer), resetando o bindingSource e carregando o formulário novamente:

 private void btnCancelar_Click(object sender, EventArgs e)
        {
            pContainer.Enabled = false;
            funcionarioBindingSource.ResetBindings(false);
            this.Form1_Load(sender,e);
        }

7 – Código do botão Adicionar que define o modo de alteração para Added, habilita o Panel, inclui um novo Funcionário e se move para o último registro, colocando o foco no Nome:

 private void btnAdicionar_Click(object sender, EventArgs e)
    {
            oStatus = EntityState.Added;
            picFoto.Image = null;
            pContainer.Enabled = true;
            funcionarioBindingSource.Add(new Funcionario());
            funcionarioBindingSource.MoveLast();
            funcionarioBindingSource.AddNew();
            LimpaControles();
            txtNome.Focus();
    }

A inclusão será efetivada quando o botão Salvar for clicado.

8 – No código do botão Salvar verificamos se o modo de operação é edição e neste caso, chamamos o método Update() do web service para alterar os dados. No modo Added vamos incluir dados na tabela Funcionários chamando o método Inserir() do web service:

 private void btnSalvar_Click(object sender, EventArgs e)
        {
                try
                {
                    funcionarioBindingSource.EndEdit();
                    Funcionario ofunci = funcionarioBindingSource.Current as Funcionario;
                    if (ofunci != null)
                    {
                            FuncionariosServiceSoapClient funci = new FuncionariosServiceSoapClient(); 
                            if(oStatus==EntityState.Added)
                            {
                                ofunci.FuncionarioID = funci.Inserir(ofunci);
                            }
                            else if( oStatus==EntityState.Changed)
                            {
                              funci.Update(ofunci);
                            }
                            gdFuncionarios.Refresh();
                            pContainer.Enabled = false;
                            oStatus = EntityState.Unchanged;
                    }
                }
                catch (Exception ex)
                {
                    MetroFramework.MetroMessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
         }

Agora é só alegria.

Executando o projeto temos o seguinte resultado:

Temos assim a nossa aplicação Windows Forms usando o estilo Metro e realizando o CRUD via web service para manutenção de dados no SQL Server com Dapper.

Pegue o código da solução aqui: CRUD_Dapper_WebService.zip (sem as referências).