segunda-feira, 31 de julho de 2017

Trabalhando com data binding no Windows Forms - parte 3

Por André Alves Lima em 26/07/2017

Sincronia entre DataGridView e outros controles

Algo muito mágico que nós recebemos “de brinde” ao utilizarmos data binding no Windows Forms é ligação entre o registro selecionado no grid e outros controles que estejam ligados com a mesma coleção. Para entendermos como isso funciona, vamos adicionar três TextBoxes na nossa janela. Cada TextBox representará uma propriedade da nossa classe “Produto“:
Se adicionarmos um data binding em cada um dos TextBoxes, ligando a propriedade “Text” deles com a propriedade correspondente da coleção de produtos, veja só a “mágica” que acontece automaticamente:
1
2
3
4
// C#
tbId.DataBindings.Add("Text", _produtos, "Id");
tbNome.DataBindings.Add("Text", _produtos, "Nome");
tbValorUnitario.DataBindings.Add("Text", _produtos, "ValorUnitario");
1
2
3
4
' VB.NET
TbId.DataBindings.Add("Text", Produtos, "Id")
TbNome.DataBindings.Add("Text", Produtos, "Nome")
TbValorUnitario.DataBindings.Add("Text", Produtos, "ValorUnitario")

Com DataSet e DataTable você não precisa de INotifyPropertyChanged

Como mencionei anteriormente, os controles do Windows Forms já implementam a interface INotifyPropertyChanged nativamente. Isso também acontece com diversas outras classes do .NET Framework, como, por exemplo, DataSet e DataTable. Para verificarmos se isso é realmente verdadeiro, vamos adicionar uma DataTable no nosso formulário:
1
2
// C#
private DataTable _produtosDT = new DataTable();
1
2
' VB.NET
Private ProdutosDT As New DataTable()
Em seguida, vamos substituir a nossa implementação, de forma que os data bindings considerem a DataTable (e não a coleção de produtos):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// C#
_produtosDT.Columns.Add("Id", typeof(int));
_produtosDT.Columns.Add("Nome");
_produtosDT.Columns.Add("ValorUnitario", typeof(decimal));
 
_produtosDT.Rows.Add(1, "Produto 1", 1.23m);
_produtosDT.Rows.Add(2, "Produto 2", 4.56m);
_produtosDT.Rows.Add(3, "Produto 3", 7.89m);
 
dgvProdutos.DataSource = _produtosDT;
 
tbId.DataBindings.Add("Text", _produtosDT, "Id");
tbNome.DataBindings.Add("Text", _produtosDT, "Nome");
tbValorUnitario.DataBindings.Add("Text", _produtosDT, "ValorUnitario");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
' VB.NET
ProdutosDT.Columns.Add("Id", GetType(Integer))
ProdutosDT.Columns.Add("Nome")
ProdutosDT.Columns.Add("ValorUnitario", GetType(Decimal))
 
ProdutosDT.Rows.Add(1, "Produto 1", 1.23)
ProdutosDT.Rows.Add(2, "Produto 2", 4.56)
ProdutosDT.Rows.Add(3, "Produto 3", 7.89)
 
DgvProdutos.DataSource = ProdutosDT
 
TbId.DataBindings.Add("Text", ProdutosDT, "Id")
TbNome.DataBindings.Add("Text", ProdutosDT, "Nome")
TbValorUnitario.DataBindings.Add("Text", ProdutosDT, "ValorUnitario")
Não esqueça também de alterar o código do clique do botão!
1
2
3
4
5
6
// C#
private void btExemplo_Click(object sender, EventArgs e)
{
    _produtosDT.Rows[0]["Nome"] = tbExemplo.Text;
    _produtosDT.Rows.Add(++_ultimoId, _ultimoId.ToString(), _ultimoId);
}
1
2
3
4
5
6
' VB.NET
Private Sub BtExemplo_Click(sender As Object, e As EventArgs) Handles BtExemplo.Click
    ProdutosDT.Rows(0)("Nome") = TbExemplo.Text
    UltimoId += 1
    ProdutosDT.Rows.Add(UltimoId, UltimoId.ToString(), UltimoId)
End Sub
Execute a aplicação e observe que o efeito será exatamente o mesmo que tivemos com a nossa coleção de produtos.

Baixe o projeto de exemplo

Para baixar o projeto de exemplo desse artigo, assine a minha newsletter. Ao fazer isso, além de ter acesso ao projeto, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário no final do artigo.

Concluindo

O data binding no Windows Forms é um conceito que eu infelizmente vejo pouquíssimas pessoas utilizando. Eu verdadeiramente espero que os desenvolvedores optem por não utilizar data binding simplesmente por falta de conhecimento. Como você pode perceber, tem muita coisa que pode ser resolvida com pouquíssimas linhas de código utilizando data binding que levariam dezenas e dezenas de linhas sem a sua utilização.
Você já conhecia tudo isso que eu apresentei aqui nesse artigo? Se sim, conte mais sobre as suas experiências nos comentários. E se você não tinha conhecimento sobre o funcionamento do data binding no Windows Forms, agora não tem mais desculpa. Pare de ficar implementando código manual para copiar informações de controles em classes de dados, utilize data binding e o seu código ficará muito mais limpo!
Até a próxima!
André Lima

Nenhum comentário:

Postar um comentário