VB .NET - DataBinding - DataTable e CurrencyManager (dica rápida)


Hoje veremos como criar um DataTable via código, exibir os registros em um DataGridView e usar o objeto CurrencyManager para realizar a navegação pelos registros.

Do que você vai precisar ?

  1. Visual Studio 2012 Express for desktop

Teoria

No VB.NET os controles podem ter muitas propriedades que podem ser vinculadas a uma fonte de dados. Cada propriedade databound possui um -0 objeto Binding associado. Desde que um controle pode ter muitas objetos Binding, o controle possui uma coleção (uma instância da classe ControlBindingsCollection) de todos os objetos Bindings. (Diferentes propriedades de um mesmo controle podem  estar ligadas a diferentes datasources.)

Cada objeto Binding se comunica com um CurrencyManager ou PropertyManager. As classes CurrencyManager e PropertyManager são derivadas da classe base BindingManagerBase.  O objetivo da classe BindingManagerBase é manter a concorrência entre a fonte de dados e o controle. Das duas classes a classe CurrencyManager é usada quando a fonte de dados implementa a interface IList ( DataView, DataSet, ArrayList,etc.) 

A classe CurrencyManager pode ser usada para vinculação simples ou complexa , porém a classe PropertyManager é usada quando o datasource é uma instância de uma classe definida pelo usuário. A propriedade dos controles esta vinculada a propriedade exposta por este objeto e ela somente pode ser usada para vinculação simples.

Geralmente você pode usar a seguinte regra: Usar o CurrencyManager quando sua classe é um Container de dados e usar o PropertyManager quando quiser vincular um controle a propriedades expostas pela sua própria classe.

Como podemos ter um formulário com muitos controles cada um vinculado a uma fonte de dados diferente, precisamos de uma classe para gerenciar os objetos CurrencyManager e PropertyManager. A classe BindingContext faz isto , e , cada formulário possui por padrão um objeto BindingContext associado a ele. (Você pode criar outros objetos BindingContext no formulário).

Resumindo:

  1. Um controle possui muitas propriedades que podem ser vinculadas.
  2. Cada propriedade databound do controle tem um objeto Binding associado a ela.
  3. Todos os objetos Binding para um controle estão contidos péla propriedade DataBindings do controle a qual é uma instãncia da classe ControlBindingsCollection.
  4. Cada objeto databinding se comunica com um objeto CurrencyManager ou PropertyManager.
  5. CurrencyManager e PropertyManager são derivados da classe BindingManagerBaseClass
  6. O objetoe BindingContext é uma coleção de objetos  CurrencyManager e PropertyManager.
  7. Um formulário contém por padrão um objeto BindingContext.
  8. Cada objeto  CurrencyManager ou PropertyManager encapsula o acesso a dados para uma fonte de dados por objeto BindingContext.

Agora vamos à prática...

Abra o Visual Studio 2012 Express for desktop e crie um novo projeto do tipo Windows Forms Application com o nome DataGridView_CurrencyManager;

No formulário form1.vb inclua os seguintes controles a partir da ToolBox:

  1. DataGridView
  2. Groupbox 
  3. Label1, Label2, Label3 e Label4
  4. Button - btnAnterior - <<Anterior
  5. Button - btnProximo - Proximo>>
  6. Button - btnEncerrar - Encerrar

O leiaute do formulário é mostrado a seguir:

Vamos definir uma variável privada referente ao DataTable - dt - que iremos criar e outra referente a classe CurrencyManager. Esta classe gerencia uma lista de objetos vinculados e deriva da classe BindingManagerBase.  Você usa o BindingContext para retornar um CurrencyManager ou PropertyManager.

Private dt As New DataTable
Private cma As CurrencyManager = DirectCast(BindingContext(dt), CurrencyManager)

Vamos ao código:

1- No evento Load do formulário é onde vamos carregar o datatable com dados e exibir os registros no datagridview:

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'define as colunas
        dt.Columns.Add("Nome")
        dt.Columns.Add("Cidade")
        dt.Columns.Add("Estado")
        'preenche o datatable
        dt.LoadDataRow(New Object() {"Jose Carlos", "Brasilia", "Distrito Federal"}, True)
        dt.LoadDataRow(New Object() {"Miriam Estela", "Goiânia", "Goiás"}, True)
        dt.LoadDataRow(New Object() {"Janice Rachel", "Lins", "São Paulo"}, True)
        dt.LoadDataRow(New Object() {"Yuri Siqueira", "Alfenas", "Minas Gerais"}, True)
        dt.LoadDataRow(New Object() {"Bianca Rodrigues", "Londrina", "Paraná"}, True)
        dt.LoadDataRow(New Object() {"Paulo Clemente", "Salvador", "Bahia"}, True)
        dt.LoadDataRow(New Object() {"Marcos Bueno Lima", "Cabo Frio", "Rio de Janeiro"}, True)
        dt.LoadDataRow(New Object() {"Maria Souza", "Santos", "São Paulo"}, True)
        'preenche o datagridview
        DataGridView1.DataSource = dt
        'exibe os valores nas labels
        Label1.DataBindings.Add("Text", dt, "Nome")
        Label2.DataBindings.Add("Text", dt, "Cidade")
        Label3.DataBindings.Add("Text", dt, "Estado")
        Label4.Text = "0"
        AddHandler cma.CurrentChanged, AddressOf CurrentChanged
    End Sub

Usamos o método LoadDataRow para localizar e atualizar uma linha do datatable. Esse método localiza e atualiza uma linha específica. Se nenhuma linha correspondente for encontrada, uma nova linha será criada usando os valores fornecidos conforme fizemos no código.

2- No evento Click dos botões de comando temos o código que usa o CurrencyManager e sua propriedade Position para obter a posição atual da lista e assim permitira navegar pelos registros :

 Private Sub btnAnterior_Click(sender As Object, e As EventArgs) Handles btnAnterior.Click
        If cma.Position > 0 Then
            cma.Position -= 1
        End If
    End Sub

    Private Sub btnProximo_Click(sender As Object, e As EventArgs) Handles btnProximo.Click
        If cma.Position < dt.Rows.Count + 2 Then
            cma.Position += 1
        End If
    End Sub

Em um lista de itens podemos visualizar somente um item ou a lista inteira, e, para determinar qual o item será visto definimos a propriedade Position entre o número 0 (o início da lista) e o fim da lista (Count-1).

3- No delegate CurrentChanged  temos a exibição da posição atual no controle Label:

 Private Sub CurrentChanged(ByVal sender As Object, ByVal e As EventArgs)
      Label4.Text = DirectCast(sender, CurrencyManager).Position.ToString
 End Sub

"Delegate" ou Delegado é o nome usado para descrever um procedimento em VB.NET que permite a você controlar o código que atualmente manipula um evento. (Como um evento Change , Click , Load , etc.). Um delegate é então uma classe que pode manipular uma referência um método.

Executando a aplicação teremos o resultado abaixo:

Pegue o projeto completo aqui: DataGridView_CurrencyManager.zip

Romanos 7:14 Porque bem sabemos que a lei é espiritual; mas eu sou carnal, vendido sob o pecado.

Romanos 7:15 Pois o que faço, não o entendo; porque o que quero, isso não pratico; mas o que aborreço, isso faço.

Romanos 7:16 E, se faço o que não quero, consinto com a lei, que é boa.

Romanos 7:17 Agora, porém, não sou mais eu que faço isto, mas o pecado que habita em mim.

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti