LINQ to SQL - Revisitando o DataBinding
Neste artigo eu estou revisitando o DataBinding em tempos de LINQ To SQL para mostrar como ficou o DataBinding quando usado com os recursos do LINQ to SQL. Com certeza ficou mais simples.
Os fundamentos do DataBinding permanecem o mesmo e as etapas a realizar também. A diferença, que você mesmo vai notar, é que com o LINQ to SQL o caminho que o desenvolvedor tem que percorrer ficou mais limpo, suave sem as preocupações de gerenciar os objetos da ADO .NET como conexões, comandos, dataadatpers, etc...
A seguir temos as etapas que iremos seguir para criar a aplicação exemplo deste artigo :
Criar um DataSource diretamente na sua aplicação;
Criar uma conexão com a fonte de dados;
Gerar o mapeamento OR/M com o LINQ;
Selecionar os dados da fonte de dados e o modo de exibição no formulário Windows;
Criar uma interface amigável com o mínimo de código possível;
Eu estou usando o Visual Basic 2008 Express Edition e o banco de dados SQL Server 2005 Express Edition (tá na hora de mudar para o SQL Server 2008 !!!).
Para este exemplo eu vou usar um banco de dados criado no SQL Server 2005 chamado Cadastro.mdf e a tabela Produtos.
Abra o Visual Basic 2008 Express Edition e no menu File selecione New Project;
A seguir selecione o projeto do tipo Windows Application usando a linguagem Visual Basic com o nome Linq_DataBinding;
A seguir clique com o botão direito do mouse sobre o nome do projeto e selecione a opção Add New item;
Na janela Templates selecione o item Service-based DataBase com o nome Cadastro.mdf;
A seguir crie a tabela Produtos com a estrutura definida abaixo:
Ao final destas etapas teremos o projeto exibindo na janela Solution Explorer o formulário form1.vb e o banco de dados Cadastro.mdf conforme a figura abaixo:
Agora que já temos o banco de dados SQL Server criado vamos incluir uma referência ao LINQ to SQL. Clique com o botão direito do mouse sobre o nome da solução e selecione a opção Add New Item:
A seguir selecione o template LINQ to SQL classes e informe o nome PRODUTO.dbml conforme a seguir:
O descritor do LINQ to SQL será aberto. Arraste a tabela produtos para a primeira região vazia do descritor para que seja gerada o entidade Produto através do mapeamento objeto relaciona com a tabela Produtos.
A segunda região pode ser usada para mapear métodos através de stored procedures. Como não temos este recurso no nosso exemplo vamos esconder esta janela. Para esconder a janela clique na região como botão direito do mouse e selecione Hide Methods Pane.
Vamos agora alterar o nome das propriedades da entidade Produto selecionando a propriedade e na janela de propriedades alterando sua propriedade name. Ao final teremos a entidade com as propriedades alteradas conforme a figura abaixo. Note que a tabela Produtos não foi afetada pois estamos alterando a nossa entidade Produto.
Altere também o nome da entidade de Produto para PRODUTO conforme a figura abaixo:
Selecione o formulário form1.vb e inclua a partir da ToolBox os seguintes componentes:
Defina a propriedade BindingSource do controle BindingNavigatorProdutos como sendo igual a BindingSourceProdutos;
Agora precisamos carregar os dados e efetuar o databinding, para isso vou usar o evento Load do formulário e definir a rotina carregaDados() que irá efetuar a consulta LINQ e efetuar e chamar a rotina que realiza o databinding.
A primeira coisa a fazer é definir uma variável dc do tipo DataContext a nível de escopo do formulário:
Dim
dc As New PRODUTODataContextA seguir no evento Load do formulário chamamos a rotina carregaDados();
Private Sub
Form2_Load(ByVal sender
As System.Object, ByVal e
As System.EventArgs)
Handles MyBase.Load
carregadados() End Sub |
A rotina carregaDados efetua uma consulta LINQ selecionando todos os produtos da entidade PRODUTOs (Note que LINQ adicionou um s ao nome da entidade), e em seguida atribui o resultado ao BindingSourceProdutos chamando a rotina criardatabinding()
Private Sub
carregadados() Dim consulta = From p In dc.PRODUTOs _
Select p BindingSourceProdutos.DataSource = consulta
End Sub |
A rotina criardatabinding efetua o databinding para cada controle TextBox do formulário ao seu respectivo item na entidade Produto;
Private Sub
criardatabinding() Me.txtCodigo.DataBindings.Add("Text", BindingSourceProdutos, "ProdutoID") Me.txtNome.DataBindings.Add("Text", BindingSourceProdutos, "nomeProduto") Me.txtPreco.DataBindings.Add("Text", BindingSourceProdutos, "precoProduto") Me.txtEstoque.DataBindings.Add("Text", BindingSourceProdutos, "estoqueProduto")
Me.txtCategoria.DataBindings.Add("Text",
BindingSourceProdutos, "categoriaProduto") End Sub |
Com isso já podemos executar o projeto para vermos os registros sendo exibidos no formulário e efetuar a navegação pelos mesmos;
Para podermos incluir , excluir e alterar dados usando o databinding vamos incluir um novo Button na barra BindingNavigator, definir uma imagem para o Button e alterar a sua propriedade Name para SaveItem;
No evento Click deste Button inclua o código a seguir:
Private Sub
saveItem_Click(ByVal sender
As System.Object, ByVal
e As System.EventArgs)
Handles saveItem.Click
Me.BindingSourceProdutos.EndEdit() End Sub |
Neste código estamos encerrando qualquer edição pendente e chamando o método SubmitChanges do DataContext para persistir as informação na tabela Produtos.
O método SubmitChanges calcula o conjunto de objetos modificados para serem inseridos, atualizados ou excluídos e executa os comandos apropriados para implementar as alterações para o banco de dados.
Poderiamos incrementar o exemplo criando uma consulta por categoria usando o LINQ mas deixo isso como um exercício.(Eu implementei a consulta no projeto em anexo.)
Pegue o projeto completo aqui: Linq_To_SQL_DataBinding.zip
Eu sei é apenas LINQ to SQL, mas eu gosto...
Referências:
VB .NET - DataBinding : Sincronização automática com Mestre Detalhe
VB .NET - Criando a base de dados, as tabelas e os relacionamentos no VB2005
José Carlos Macoratti