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:
- Visual Studio 2017 Community
- Dapper
- WebService
- MetroFramework
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).