Récupération des données à partir d'une liste de tableaux d'objets VB.NET
Question
Je suis en train de récupérer la valeur correcte d'un ArrayList d'objets (.NET Framework 1.1):
J'ai défini ce qui suit:
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
Le code événement Form_Load contient:
Dim AnItemObj As New ItemInfo
Ensuite, une boucle qui comprend:
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Je devrais maintenant un ArrayList de ces objets, si je tente de récupérer les données:
MsgBox(AlList(5).ItemNo)
Je reçois toujours le ItemNo de la dernière valeur dans la liste.
Qu'est-ce que je suis absent?
La solution
Mettez le code suivant:
Dim AnItemObj As New ItemInfo
dans la boucle qui ajoute AnItemObj à la liste.
Lorsque vous ajoutez un type de référence à une liste, vous ajoutez seulement la référence, pas la valeur.
Cela signifie que si vous ajoutez 10 fois la même instance à une liste, il va ajouter 10 fois la même référence à la liste. Mais si après vous avez encore une référence à cette instance, vous pouvez modifier ses propriétés et que les 10 entrées du point de liste à la même référence en mémoire, les 10 entrées seront modifiées.
Autres conseils
Alors, vous avez:
Dim AnItemObj As New ItemInfo
For ...
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Qu'est-ce qui se passe ici est que vous créez un objet unique, définissant les valeurs sur elle, et en ajoutant une référence à elle, à votre liste. Vous changez alors votre itemInfo et addign une autre référence au même article à votre liste
Vous avez besoin de construire un nouvel objet sur chaque boucle, lâche ainsi:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Êtes-vous en train de créer une nouvelle instance de itemInfo pour chaque incrément de la boucle?
Je ne vois pas votre code de boucle complète mais j'imagine que la cause ne fixe pas de AnItemObj à un nouvel objet itemInfo. Donc, vous venez de finir par modifier le même objet et l'ajouter à la liste à nouveau (tous les éléments du point de liste au même objet).
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)