VB.NET - Usando o BindingSource


O Controle DataGridView suporta o modelo padrão de vinculação dos formulários Windows, e, desta forma pode ser vinculado a uma variedade de fonte de dados. Em muitas circunstâncias você efetuará a vinculação a um componente BindingSource que irá gerenciar os detalhes da interação com a fonte de dados.

O componente BindingSource pode representar qualquer fonte de dados em um formulário Windows e dá a você uma grande flexibilidade quando da seleção ou modificação da localização dos seus dados.

Podemos fazer a vinculação do BindingSource qualquer um dos seguintes objetos/Interfaces:

 

Object

-   System.Type

-   IEnumerable

-   ICollection

-   IList

-   IListSource

-   IBindingList

-   IBindingListView

Resumindo, o componente BindingSource possui duas funções básicas:

  1. Simplificar a vinculação de controles em um formulário a fonte de dados, fornecendo diversos recursos para realizar as operações com dados. Isto é possível pela vinculação do componente a sua fonte de dados e então vincular os controles do formulário ao componente BindingSource. Todas as interações com os dados tais como : navegação, filtragem, atualização, ordenação são feitas pela chamada ao componente BindingSource.
  2. Poder atuar como uma fonte de dados fortemente tipada. O tipo da fonte de dados relacionada é definida através de um dos seguintes mecanismos:

Ambos mecanismos criam um lista fortemente tipada, e , o BindingSource suporte a vinculação simples e complexa de dados como indicada pelas suas propriedade DataSource e DataMember

O BindingSource fornece membros para acessar os dados relacionados. O item atual pode ser retornado através da propriedade Current, e lista inteira pode ser retornada através da propriedade List

As operações de edição são suportadas no item atual através dos métodos : Current , RemoveCurrent, EndEdit, CancelEdit, Add e AddNew.

Embora o tratamento de valores atualizados é feito automaticamente para todos os tipos de fonte de dados, a classe fornece os eventos CurrentItemChanged and DataSourceChanged, que permitem uma customização.

A fonte de dados que são vinculadas ao BindingSource podem ser percorridas e gerenciadas com a classe BindingNavigator que fornece uma interface para navegação pelos itens da lista. Embora o BindingNavigator possa ser vinculado a qualquer fonte de dados ele foi criado para ser integrado com o BindingSource através da propriedade BindingNavigator.BindingSource

Muitos membros da classe BindingSource operam na lista relacionada representada pela propriedade List, e, simplesmente referencia suas operações para lista relacionada. Desta forma quando o BindingSource esta vinculado a uma implementação customizada de IList, o comportamento dos membros podem diferir do comportamento descrito na documentação da classe.  Assim, o método RemoveAt chama IList.RemoveAt. Na documentação o método RemoveAt é descrito considerando que a implementação de IList foi corretamente implementada.

A propriedade padrão para a classe  BindingSource  é DataSource e o evento padrão é CurrentChanged.

Nota: Como o BindingSource suporta a vinculação a fonte de dados simples e a complexas, a terminologia pode ser confusa. O temo list refere-se a coleção de dados da fonte de dados , item denota um simples elemento. Para fonte de dados complexas os termos equivalentes table e row são usados

Em suma, o componente BingindSource veio para resolver alguns problemas do databinding. Como você já viu, o BindingSource possui as propriedades DataSource e DataMember que você pode definir e vincular ao BindingSource , podendo inclusive alterar o DataSource do BindingSource e a vinculação ainda vai continuar funcionando.

Se você resolver usar o DataGridView para exibir os dados da tabela Customers usando o BindingSource usará o seguinte código:

             

Dim dgv As DataGridView = New DataGridView()
Dim bs As BindingSource = New BindingSource()
bs.DataSource = CustomerTable
dgv.DataSource = bs
 

 

Para definir uma visão Mestre/detalhe você  pode fazer o seguinte:

 

 bsMaster.DataSource = ds
bsMaster.DataMember = “Customers”

bsChild.DataSource = bsMaster         ' DataSource -> BindingSource(Mestre)
bsChild.DataMember = “CustOrders”   ' DataMember -> relation

dgvMaster = bsMaster
dgvChild = bsChild

 

Vejamos agora um exemplo usando o BindingSource juntamente com o DataGridView para exibir os dados da tabela Customers do banco de dados Northwind. Este banco de dados esta presente no SQL Server  mas eu estou usando o MSDE.(importei a base de dados Northwind)

 

Nota: este exemplo foi adaptado da MSDN.

 

Inicie um novo projeto no VB2005 Express dando ao mesmo um nome adequado. Eu chamei de bindingSourceDataGridView1.

 

No formulário principal inclua os componentes DataGridView e BindingSource conforme a figura abaixo:

 

Declare os seguintes Namespaces que serão usados no Projeto

Imports System.Data.SqlClient

Imports System.data

 

 

A seguir crie um rotina que será responsável pela conexão com o banco de dados seleção dos dados da tabela Customers via instrução SQL e vinculação ao BindingSource para exibição no DataGridView. A rotina exibeDados() recebe um  parâmetro string chamado selectCommand

 

Private Sub exibeDados(ByVal selectCommand As String)

        Try
            ' Especifica a string de conexão acessando o banco de dados Northiwnd no
            ' MSDE na maquina local
            Dim connectionString As String = _
            "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;_
              User ID=sa;password=;Data Source=MACORATI\VSDOTNET"

            'exemplo de string de conexão para o SQL Server na maquina local acessando Northwind
            ' "Integrated Security=SSPI;Persist Security Info=False;" + _
            ' "Initial Catalog=Northwind;Data Source=localhost"

            'Cria um novo data adapter baseado na consulta definida
            Dim dataAdapter As New SqlDataAdapter(selectCommand, connectionString)
            ' Cria um command builder para gerar os SQL para atualizar, incluir e
            ' deletar baseados no selectCommand. 
            Dim commandBuilder As New SqlCommandBuilder(dataAdapter)

            ' Preenche um novo data table e vincula ao BindingSource.
            Dim table As New DataTable()
            table.Locale = System.Globalization.CultureInfo.InvariantCulture
            dataAdapter.Fill(table)
            BindingSource1.DataSource = table

            ' Redimensiona as colunas do DataGridView
            DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
        Catch ex As SqlException
            MessageBox.Show("Para rodar este exemplo. Substitua a string de conexão usada _
                                       para um valor válido para o seu sistema.")
        End Try
    End Sub

 

Finalmente no evento Load do formulário inclua o código vincula o BindingSource ao DataGridView e que chama esta rotina com o parâmetro definindo os dados que desejamos exibir:

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

        ' Vincula o DataGridView ao BindingSource e carrega os dados do banco de dados
        Me.DataGridView1.DataSource = Me.BindingSource1
        exibeDados("select * from Customers")

    End Sub

 

Executando o projeto teremos o resultado abaixo:

 

 

Pegue o projeto completo aqui : bds_dgv1.zip

 

Eu sei, é apenas VB, mas eu gosto  !!!

Rom 7:4 Assim também vós, meus irmãos, fostes mortos quanto à lei mediante o corpo de Cristo, para pertencerdes a outro, àquele que ressurgiu dentre os mortos a fim de que demos fruto para Deus.

Rom 7:5 Pois, quando estávamos na carne, as paixões dos pecados, suscitadas pela lei, operavam em nossos membros para darem fruto para a morte.

Rom 7:6 Mas agora fomos libertos da lei, havendo morrido para aquilo em que estávamos retidos, para servirmos em novidade de espírito, e não na velhice da letra.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti