VB.NET  - Selecionando e Atualizando dados<


Neste artigo estarei mais uma vez mostrando como realizar as operações básicas de manutenção de dados focando na atualização e seleção de dados. Estarei usando o Visual Studio 2003 para criação do projeto de demonstração e do banco de dados Northwind.mdb.

A aplicação será bem simples de forma a que todos possam acompanhar e entender. No projeto teremos uma tela principal oferecida pelo formulário frmMenu.vb. Veja a figura abaixo.

O formulário principal é um container MDI para formulários filhos da aplicação e contém um componente MainMenu que foi incluído a partir da Toolbox.

Através de MainMenu criamos um menu com duas opções:

- Clientes-Editar - que irá chamar o formulário filho - frmeditar.vb

- Encerrar - que irá encerrar a aplicação

O formulário para editar clientes gerado pelo arquivo frmeditar.vb tem a seguinte aparência:

Este formulário exibe os dados dos clientes da tabela Customers do banco de dados Northwind.mdb

Ele usa uma classe chamada Clientes.vb onde estão as regras de negócio para acessar os dados dos clientes e salvar as alterações realizadas.

Foi utilizado o provedor OleDb através da importação(na classe Clientes)

Imports
System.Data.Oledb

O código para chamar o formulário frmeditar.vb é:
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click

Dim frmedita As New frmEditar
frmedita.MdiParent =
Me
frmedita.Show()

End
Sub

A vinculação dos controles com os dados é feita usando o dataBinding. Para saber detalhes sobre o DataBinding leia os artigos:

Além dos botões usados para navegação pelos registros, que usam o recurso do bindingcontext, temos o botão que efetiva o salvamente das alterações realizadas.

Afinal para que serve esse tal de BindingContext. ??

Qualquer fonte de dados que você vincula a um formulário ou controle container (picture box,group box, etc.) será associado ao objeto CurrencyManager.

O objeto CurrencyManager gerencia a posição e também supervisiona as vinculações a fonte de dados. Existe um objeto CurrencyManager no formulário para cada fonte de dados que você vincula a ele. Se todos os controles do formulário estiverem vinculados a uma única fonte (Ex: Vários TextBox vinculados a mesma tabela como no nosso projeto) então eles irão compartilhar o mesmo objeto CurrencyManager.

Há momentos , porém, quando os controles no formulário estarão vinculados a fonte de dados distintas. Neste caso haverá múltiplos objetos CurrencyManager no formulário, cada um gerenciando o registro ou dado que esta sendo usado pelo controle. Isto pode se tornar um pouco confuso. É ai que entra o objeto BindingContext. Cada formulário Windows possui um objeto BindingContext.

O objeto BindingContext gerencia todos os objetos CurrencyManager no formulário e ajuda nos a navegar , incluir , excluir e editar registros em uma tabela. Então estamos usando o objeto BindingContext para fazer as seguintes tarefas:

Veja um projeto de Cadastro de Clientes completo no artigo: ADO.NET - Criando uma Cadastro de Clientes

O botão Pesquisar possui o seguinte código no seu evento Click:

Private Sub btnPesquisar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPesquisar.Click

Dim f As New frmPesquisar(Me)
f.ShowDialog()

End Sub

O formulário frmPesquisar exibe a relação completa dos clientes e permite que um cliente seja selecionado pelo nome de contato.  A medida que o nome é digitado a localização é efetuada como mostra a figura a seguir:

O evento Load do formulário monta o Grid exibindo os dados dos clientes através da propriedade DataGridTableStyle.

É através dela que definimos os nomes das colunas e os campos que vamos exibir.

Veja abaixo o código para saber como usar este recurso.

 

O código do evento Load é o seguinte:

Private Sub frmPesquisar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


' Vou usar o mesmo DataTable usado no formulário frmEditar...

dgDados.DataSource = formularioEditar.DTBClientes


' Criando um DataGridTableStyle para exibição dos dados no grid

Dim ts As New DataGridTableStyle


ts.MappingName = "Clientes"


Dim
txt1 As New DataGridTextBoxColumn

txt1.MappingName = "CustomerId"

txt1.HeaderText = "Cliente"

txt1.Width = 75


Dim
txt2 As New DataGridTextBoxColumn

txt2.MappingName = "ContactName"

txt2.HeaderText = "Contato"

txt2.Width = 150


Dim
txt3 As New DataGridTextBoxColumn

txt3.MappingName = "CompanyName"

txt3.HeaderText = "Empresa"

txt3.Width = 150


Dim
txt4 As New DataGridTextBoxColumn

txt4.MappingName = "Address"

txt4.HeaderText = "Endereço"

txt4.Width = 150


Dim
txt5 As New DataGridTextBoxColumn

txt5.MappingName = "Country"

txt5.HeaderText = "País"

txt5.Width = 50


ts.GridColumnStyles.Add(txt1)

ts.GridColumnStyles.Add(txt2)

ts.GridColumnStyles.Add(txt3)

ts.GridColumnStyles.Add(txt4)

ts.GridColumnStyles.Add(txt5)

dgDados.TableStyles.Add(ts)


End
Sub

A medida que o usuário digita, o registro é automaticamente localizado e posicionado no datagrid. Isto é feito através do evento textChanged do controle txtContato; o código usado neste evento é dado abaixo:

Private Sub txtContato_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtContato.TextChanged

' Pesquisando por contato usando a cláusula LIKE com o valor informado pelo usuário
Dim drs() As DataRow = formularioEditar.DTBClientes.Select("ContactName LIKE '%" + txtContato.Text + "%'")

If drs.Length > 0 Then

   Dim posicao As Integer = formularioEditar.DTBClientes.DefaultView.Find(drs(0)("CustomerId"))
  
Me.BindingContext(formularioEditar.DTBClientes).Position = posicao

End If

End Sub

Note que estamos selecionando um linha de registro (DataRow) usando a cláusula LIKE:

Dim drs() As DataRow = formularioEditar.DTBClientes.Select("ContactName LIKE '%" + txtContato.Text + "%'")

A seguir verificamos se houve registro para encontrar o cliente pelo seu código (CustomerID)

Ao clicar no botão Selecionar definimos a posição do registro no formulário formularioEditar que será exibido com seus dados.

Private Sub btnSelecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelecionar.Click

' A linha atualmente selecionada no DataGrid é passadao para o form
formularioEditar.SetPosicao(
Me.BindingContext(formularioEditar.DTBClientes).Position)
Me.Close()

End Sub

Note que eu não utilizei nenhum assistente para conexão ou para criação de controle de dados .

A classe Clientes é possui a lógica de acesso aos dados e de obtenção dos dados e sua atualização através dos métodos: obtemClientes e SalvaClientes .  Abaixo temos o código desta classe:

Imports System.Data.oledb


Public
Class Clientes

' Objetos públicos de classes visiveis no projeto


Public
conn As OleDbConnection

Public da As OleDbDataAdapter

Public cb As OleDbCommandBuilder


Public
Sub New()

' Inicializo os objetos de conexao. Modifique a string de

' acordo com seu ambiente. Ex: se voce tiver o SQL Server Express com o Northwind use a string abaixo

' conn = New SqlConnection("Data Source=.\SQLExpress;Initial Catalog=Northwind;Integrated Security=SSPI;")

' a conexão OleDb acesso o banco de dados Northwind.mdb verifique o caminho de localização no seu ambiente

conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\Northwind.mdb")

' Criamos um dataadapter com os dados da tabela Customers na conexão definida acima

' usamos uma instrução SELECT para selecionar alguns campos da tabela

da = New OleDbDataAdapter("Select CustomerId, ContactName, CompanyName, Address, Country from Customers", conn)
 

' Os comandos de inserção, alteração e exclusão são criados automaticamente através

' de um commandbuilder.

' Isto é possível pois temos somente uma única tabela definida com uma chave primária

' Para mais de uma tabela usando junções (joins) devemos definir os comandos via código

cb = New OleDbCommandBuilder(da)


End
Sub

Public Function obtemClientes() As DataTable

' Definimos um objeto DataTable

Dim dt As DataTable = New DataTable("Clientes")

' Preenchemos e devolvemos um DataTable como o resultado...

da.Fill(dt)

Return dt

End Function

Public Sub SalvaClientes(ByVal dt As DataTable)

' atualizamos os dados via método update

da.Update(dt)

End Sub


End
Class

Pegue o código completo e comentado do projeto aqui: atualizaSelecao.zip (sem a base de dados)

Bom estudo e até o próximo artigo VB.NET...


José Carlos Macoratti