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 ?
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:
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:
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#