Recuperar dados de um ArrayList VB.NET de objetos
Pergunta
Eu estou tentando recuperar o valor correto de um ArrayList de objetos (.NET Framework 1.1):
Eu tenho a seguinte definida:
Public AlList As New ArrayList
Public Class ItemInfo
Public ItemNo As Int16
Public ItemType As String
Public Reports As Array
Public PDFs As Array
End Class
O código de evento Form_Load contém:
Dim AnItemObj As New ItemInfo
Em seguida, um loop que inclui:
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Então, eu deveria agora tenho um ArrayList desses objetos, no entanto, se eu tentar recuperar os dados:
MsgBox(AlList(5).ItemNo)
Eu sempre obter o ItemNo do último valor na lista.
O que eu estou ausente?
Solução
Coloque o seguinte código:
Dim AnItemObj As New ItemInfo
dentro o loop que adiciona AnItemObj à lista.
Quando você adiciona um tipo de referência a uma lista, você está apenas adicionando a referência, não o valor.
Isto significa que se você adicionar 10 vezes a mesma instância a uma lista, ele irá adicionar 10 vezes a mesma referência à lista. Mas, se depois você ainda tem uma referência a este exemplo, você pode modificar suas propriedades e, como todas as 10 entradas na lista aponte para a mesma referência na memória, todas as 10 entradas será modificado.
Outras dicas
Então, você tem:
Dim AnItemObj As New ItemInfo
For ...
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
O que está acontecendo aqui é que você está criando um único objeto, definindo os valores nele, e adicionar uma referência a ele, à sua lista. Você está em seguida, alterando o seu ItemInfo e addign outra referência para o mesmo item à sua lista ??p>
Você precisa construir um novo objeto em cada loop, vagamente assim:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Você está criando uma nova instância do iteminfo para cada incremento do loop?
Eu não posso ver o seu código de loop completo, mas eu imagino que a causa não é a criação AnItemObj a um objeto New ItemInfo. Então você só acabam modificando o mesmo objeto e adicioná-lo à lista novamente (todos os itens na lista aponte para o mesmo objeto).
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)