VB.NET - Usando o CurrencyManager


Neste artigo você vai aprender um pouco mais sobre a classe CurrencyManager. Esta classe gerencia uma lista de objetos vinculados e deriva da classe BindingManagerBase.  Você usa o BindingContext para retornar um CurencyManager ou PropertyManager.

Neste artigo eu vou criar uma classe chamada Pessoas (na verdade uma classe deveria estar no singular). Esta classe apenas fornece 3 propriedades públicas : Nome , Endereco e Profissao e Email.

Vou criar uma coleção de objetos Pessoa e a seguir obter um CurrencyManager para gerenciar a coleção de pessoas. Você pode estender o projeto persistindo os dados usando serialização ou outro recurso. Não vou portanto me preocupar em salvar os dados usados.

Inicie um novo projeto no VS.NET do tipo Windows Application usando a linguagem VB.NET. No formulário padrão altere o nome para frmCurrencyManager e inclua os controles conforme abaixo:

Controles usados no formulário - frmCurrencyManager

4 TextBox ,  5 labels, 4 Button

O código da classe Pessoas é dada a seguir:(Como eu já disse é aconselhável usar o nome da classe no singular.)

Para incluir uma classe no projeto selecione a opção Add Class no Menu Project:

Public Class Pessoas

    Private m_Nome As String
    Private m_Endereco As String
    Private m_Profissao As String
    Private m_Email As String
    Public Property Nome() As String
        Get
            Return m_Nome
        End Get
        Set(ByVal Value As String)
            m_Nome = Value
        End Set
    End Property

    Public Property Endereco() As String
        Get
            Return m_Endereco
        End Get
        Set(ByVal Value As String)
            m_Endereco = Value
        End Set
    End Property

    Public Property Profissao() As String
        Get
            Return m_Profissao
        End Get
        Set(ByVal Value As String)
            m_Profissao = Value
        End Set
    End Property

    Public Property Email() As String
        Get
            Return m_Email
        End Get
        Set(ByVal Value As String)
            m_Email = Value
        End Set
    End Property

    Public Sub New(ByVal nome As String, ByVal endereco As String, ByVal profissao As String, ByVal email As String)
      m_Nome = nome
        m_Endereco = endereco
        m_Profissao = profissao
        m_Email = Email
    End Sub
End Class

 

Lembrando que a classe acima apresenta 4 propriedades e um construtor (New) que atribui os valores as variáveis objeto que são membros da classe.


Agora vejamos o código do evento Load do formulário:

 

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

        'cria uma nova coleção de objetos Pessoas
        Pessoas = New Collection
       ' inclui alguns valores no objeto e os inclui na coleção
        Pessoas.Add(New Pessoas("Jose Carlos Macoratti", "Rua Mirassol , 100", "teste", "macoratti@yahoo.com"))
        Pessoas.Add(New Pessoas("Jessica Naara Lima", "Al. Lima , 10", "Médica", "jessica@bol.com.br"))
        Pessoas.Add(New Pessoas("Jefferson Andre Ribeiro", "Pça Sol , 108", "Engenheiro", "jefferson@ig.com.br"))

        'cria um currencymanager para a coleção
        m_CurrencyManager = CType(Me.BindingContext(Pessoas), CurrencyManager)
        'vincula as propriedades a cada controle
        txtNome.DataBindings.Add("Text", Pessoas, "Nome")
        txtEndereco.DataBindings.Add("Text", Pessoas, "Endereco")
        txtProfissao.DataBindings.Add("Text", Pessoas, "Profissao")
        txtEmail.DataBindings.Add("Text", Pessoas, "Email")
        'atribui as rotinas FormataDados e ParseDados ao controle txtProfissao
        Dim binding_object As Binding = txtProfissao.DataBindings("Text")
        AddHandler binding_object.Format, AddressOf FormataDados
        AddHandler binding_object.Parse, AddressOf ParseDados

        'atualiza o currencyManager
        m_CurrencyManager.Refresh()

        atualizaEstadoControle()
    End Sub

 

Quando o formulário for carregado uma coleção de objetos Pessoas será criado e um CurrencyManager será obtido para este objeto.

A seguir o programa vincula as caixas de texto do formulário as coleção de objetos Pessoas.

A seguir as rotinas FormataDados e ParseDados:

Private Sub FormataDados(ByVal sender As Object, ByVal e As ConvertEventArgs)
        If e.Value.Equals("teste1") Then
            e.Value = "Alterado"
            Dim binding_object As Binding = DirectCast(sender, Binding)
            binding_object.Control.BackColor = Color.Gold
        Else
            Dim binding_object As Binding = DirectCast(sender, Binding)
            binding_object.Control.BackColor = Color.White
        End If
    End Sub

 

Private Sub ParseDados(ByVal sender As Object, ByVal e As ConvertEventArgs)
        If e.Value.Equals("teste2") Then
            e.Value = "Macoratti"
        End If
    End Sub

Neste código eu apenas estou verificando se o conteúdo do controle txtProfissao é alterado para "teste1". Neste caso o objeto é atualizado com o valor Alterado e a cor de fundo para amarelo ouro.

Se o conteúdo for alterado para "teste2" então o valor do objeto é alterado para Macoratti.

A rotina que atualizaEstadoControle é dado a seguir:


    
    Private Sub atualizaEstadoControle()
        btnAnt.Enabled = m_CurrencyManager.Position > 0
        btnProx.Enabled = m_CurrencyManager.Position < m_CurrencyManager.Count - 1
        lblposicao.Text = m_CurrencyManager.Position + 1 & " de " & m_CurrencyManager.Count
    End Sub

Neste código os botões são habilitados/desabilitados conforme a posição do objeto CurrencyManager. O valor é exibido na Label lblPosicao.

Para encerrar o código correspondente a cada evento Click dos botões de comando do formulário:

    Private Sub btnAnt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnt.Click
        m_CurrencyManager.Position -= 1
    End Sub

    Private Sub btnProx_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProx.Click
        m_CurrencyManager.Position += 1
    End Sub

    Private Sub m_CurrencyManager_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles 
    m_CurrencyManager.PositionChanged
        atualizaEstadoControle()
    End Sub
    Private Sub btnInc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInc.Click
        m_CurrencyManager.List.Add(New Pessoas("", "", "", ""))
        m_CurrencyManager.Refresh()
        m_CurrencyManager.Position = m_CurrencyManager.Count - 1
        atualizaEstadoControle()
    End Sub

    Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
        m_CurrencyManager.RemoveAt(m_CurrencyManager.Position)
        m_CurrencyManager.Refresh()
        atualizaEstadoControle()
    End Sub

Note que o botão Inclui (+) invoca o construtor(New) com valores vazios para todas as propriedades do objeto Pessoas.

O código do botão Excluir (X) usa o método RemoveAt(posicao) para remover o valor do objeto.

O código dos demais controles (< e >) apenas controla a navegação pelos registros.

Executando o projeto temos o seguinte resultado:

Exibindo os dados da coleção Mudando o valor para teste1 o valor do objeto muda para Alterado Clicando no botão (+) um novo valor pode ser incluído.

Pegue o código da classe e do formulário aqui : cmng.zip

Até o próximo artigo VB.NET.

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