Récupération des données à partir d'une liste de tableaux d'objets VB.NET

StackOverflow https://stackoverflow.com/questions/1062320

  •  21-08-2019
  •  | 
  •  

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?

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top