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.
|
- 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 MeuItemDataPublic 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 |
Pronto ! ressuscitamos a propriedade ItemData .
Aguarde mais artigos sobre o VB.NET...
José Carlos Macoratti