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).




