Abrufen von Daten aus einer VB.NET Arraylist von Objekten
Frage
Ich versuche, den richtigen Wert aus einer Arraylist von Objekten (.NET 1.1 Framework) abgerufen werden:
Ich habe folgendes festgelegt:
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
Der form_load Ereigniscode enthält:
Dim AnItemObj As New ItemInfo
Dann wird eine Schleife, der folgendes beinhaltet:
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Also sollte ich jetzt eine Arraylist dieser Objekte haben, aber wenn ich versuche, die Daten abzurufen:
MsgBox(AlList(5).ItemNo)
ich immer die Art.Nr. des letzten Wertes in der Liste erhalten.
Was bin ich fehlt?
Lösung
Setzen Sie den folgenden Code ein:
Dim AnItemObj As New ItemInfo
innerhalb die Schleife, die AnItemObj zur Liste hinzufügt.
Wenn Sie einen Referenztyp auf eine Liste hinzufügen, den Sie hinzufügen, nur die Referenz, nicht der Wert.
Das bedeutet, dass, wenn Sie 10-mal die gleiche Instanz zu einer Liste hinzuzufügen, wird es 10-mal den gleichen Verweis auf die Liste hinzuzufügen. Aber wenn danach haben Sie noch einen Verweis auf diese Instanz können Sie seine Eigenschaften ändern und wie alle 10 Einträge in der Liste auf die gleiche Referenz im Speicher, alle 10 Einträge geändert werden.
Andere Tipps
So, du hast:
Dim AnItemObj As New ItemInfo
For ...
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Was ist hier passiert ist, dass Sie ein einzelnes Objekt erstellen, auf sie die Werte einstellen, und das Hinzufügen eines Verweises darauf, zu Ihrer Liste. Sie sind dann ItemInfo und addign einen anderen Bezug auf das gleiche Element auf Ihrer Liste zu ändern
Sie müssen ein neues Objekt auf jeder Schleife konstruieren, lose so:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Sind Sie für jeden Teilbereich der Schleife eine neue Instanz von Iteminfo erstellen?
Ich kann nicht Ihre vollständige Schleife Code sehen, aber ich denke, die Ursache ist nicht AnItemObj auf einen neuen ItemInfo Objekt einstellen. So dass Sie nur das gleiche Objekt am Ende zu modifizieren und sie die Liste Hinzufügen wieder (alle Elemente in der Liste auf das gleiche Objekt).
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)