VB.NET - Ressuscitando a propriedade ItemData


Se você já migrou para o VB.NET e ao utilizar os componentes combobox e listbox não sentiu falta da propriedade ItemData , é apenas uma questão de tempo. Mais cedo ou mais tarde você vai precisar da funcionalidade que ela fornecia . Não adianta procurar , não existe nada parecido no VB.NET.

Só para refrescar sua memória , a propriedade ItemData dos componentes ListBox/ComboBox do VB5/VB6 permitia que fizéssemos o seguinte:

combobox1.add("Primeiro item")
combobox1.itemdata(combobox1.newindex) = 1  
<===
combobox1.add("segundo item")
combobox1.itemdata(combobox1.newindex) = 2 
 <===
combobox1.add("terceiro item")
combobox1.itemdata(combobox1.newindex) = 3
  <===

Tínhamos então uma maneira simples de vincular um valor numérico ao texto do item exibido pelo componente.

Não se desespere , o que pode parecer uma falha no VB.NET vai permitir que mostremos como usar os recursos da linguagem para fazer algo além do precisamos.

Como agora o VB.NET é uma linguagem orientada a objetos, tudo são objetos, e, tudo deriva da classe Object. Assim, podemos armazenar um objeto em cada linha de um componente ListBox/Combobox.

No VB.NET para incluir um item nos componentes ListBox/ComboBox podemos fazer assim :

Note que que o método Add requer um tipo de dados Object.

Seu eu digitar : listbox1.Items.Add("Primeiro Item")

Embora eu esteja inserindo um texto , por trás dos panos, o VB.NET o converte o texto em um objeto String.

E um objeto string , como a maioria dos objetos,  possui o método ToString. O ComboBox e ListBox irão procurar por um método ToString para mostrar qualquer texto retornado do método.

Com isto podemos escrever uma classe que permite a inclusão de valores numéricos como chave de forma que sejam atribuídos aos itens dos componentes.

- Inicie um novo projeto no VB.NET do tipo Windows Application com o nome de ItemData
- Inclua um componente ListBox no formulário form1.vb
- No menu Project selecione a opção Add Class.
- A seguir altere o nome da classe para MeuItemData e insira o código abaixo:

Public Class MeuItemData
 

   Public Valor As Object

   Public Descricao As String
 

     Public Sub New(ByVal NovoValor As Object, ByVal NovaDescricao As String)

          Valor = NovoValor

           Descricao = NovaDescricao

      End Sub

 

     Public Overrides Function ToString() As String

          Return Descricao

     End Function

End Class

- Acima eu estou sobrescrevendo(Overrides) o método ToString na classe MeuItemData pois ela deriva da classe Object que possui o seu próprio método ToString.

- Estou definindo também dois atributos para a classe MeuItemData: Valor e Descricao.

- No construtor da classe eu atribuo os valores aos membros.

Após isto podemos ir no formulário e no evento Load incluir itens na ListBox . Abaixo temos uma visão do código durante a inclusão :

Inclua mais itens conforme o código abaixo:

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

ListBox1.Items.Add(New MeuItemData(1, "Primeiro Item"))

ListBox1.Items.Add(New MeuItemData(2, "Segundo Item"))

ListBox1.Items.Add(New MeuItemData(3, "Terceiro Item"))

ListBox1.Items.Add(New MeuItemData(4, "Quarto Item"))

ListBox1.Items.Add(New MeuItemData(5, "Quinto Item"))

End Sub

A seguir vou usar o evento SelectedValueChange para exibir o valor do item quando o usuário alterar a seleção no ListBox.

Private Sub ListBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedValueChanged

Dim ItemSelecionado As Integer
ItemSelecionado =
CType(ListBox1.SelectedItem, MeuItemData).Valor
MsgBox("Valor selecionado = " & ItemSelecionado, MsgBoxStyle.Information)

End Sub

Sou obrigado a fazer um Casting usando a função cType. Ela realiza uma conversão explicita de uma expressão para um tipo especificado de tipo de dado object, structure, class, ou interface.

A sintaxe da função é :

CType(expression, typename)

Estou usando : CType(ListBox1.SelectedItem, MeuItemData).Valor

Executando o projeto e selecionando um item da lista teremos:

Uma melhor forma de fazer isto seria inserir os valores em um arrayList ao invés de inserí-los diretamente no ListBox. Para isto definimos um arrayList e incluímos os itens conforme abaixo:

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

Dim meuArray As New ArrayList()

meuArray.Add(New MeuItemData(1, "Primeiro Item"))

meuArray.Add(New MeuItemData(2, "Segundo Item"))

meuArray.Add(New MeuItemData(3, "Terceiro Item"))

meuArray.Add(New MeuItemData(4, "Quarto Item"))

meuArray.Add(New MeuItemData(5, "Quinto Item"))

End Sub

Agora podemos definir o ArrayList para a propriedade DataSource do ListBox. Isto permite controlar melhor qual propriedade da nossa classe queremos que seja exibida usando as propriedades DisplayMember e ValueMember.

O código ficaria assim :

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

Dim meuArray As New ArrayList()

meuArray.Add(New MeuItemData(1, "Primeiro Item"))

meuArray.Add(New MeuItemData(2, "Segundo Item"))

meuArray.Add(New MeuItemData(3, "Terceiro Item"))

meuArray.Add(New MeuItemData(4, "Quarto Item"))

meuArray.Add(New MeuItemData(5, "Quinto Item"))

 

With ListBox1
    .DisplayMember = "Descricao"
    .ValueMember = "Valor"
    .DataSource = meuArray
End With

End Sub

Pronto !  ressuscitamos a propriedade ItemData .

Aguarde mais artigos sobre o VB.NET...


José Carlos Macoratti