2009-06-30 17 views
7

Ich versuche, den richtigen Wert aus einer Arraylist von Objekten (.NET 1.1 Framework) abzurufen:Abrufen von Daten aus einer VB.NET Arraylist von Objekten

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 

:

ich die definierte folgende Voraussetzungen erfüllt sein der form_load Ereigniscode enthält:

Dim AnItemObj As New ItemInfo 

dann in einer Schleife, die folgende 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 fehlt mir?

+1

Für einen Neuling ist diese Frage sehr gut formatiert und dargestellt. +1 – Cerebrus

Antwort

5

Setzen Sie den folgenden Code ein:

Dim AnItemObj As New ItemInfo 

innerhalb die Schleife, die AnItemObj zur Liste hinzufügt.

Wenn Sie einen Referenztyp zu einer Liste hinzufügen, fügen Sie nur den Verweis hinzu, nicht den Wert.

Dies bedeutet, dass wenn Sie 10 Mal die gleiche Instanz zu einer Liste hinzufügen, wird 10 Mal der gleiche Verweis auf die Liste hinzufügen. Wenn Sie jedoch später noch einen Verweis auf diese Instanz haben, können Sie deren Eigenschaften ändern, und da alle 10 Einträge in der Liste auf die gleiche Referenz im Speicher verweisen, werden alle 10 Einträge geändert.

+0

Beat mich dazu! +1 – Cerebrus

1

So, du hast:

Dim AnItemObj As New ItemInfo 
For ... 
    AnItemObj.ItemNo = AFile.RecordId 
    AnItemObj.ItemType = temp 
    AlList.Add(AnItemObj) 
Next 

Was hier passiert ist, bist du ein einzelnes Objekt zu schaffen, die Einstellung der Werte auf, und das Hinzufügen eines Verweises darauf, zu Ihrer Liste. Sie sind dann ItemInfo ändern und einen weiteren Verweis auf das gleiche Element addign zu Ihrer Liste

Sie benötigen ein neues Objekt auf jeder Schleife zu konstruieren, lose so:

Dim AnItemObj As ItemInfo 
For ... 
    AnItemObj = New ItemInfo 
    AnItemObj.ItemNo = AFile.RecordId 
    AnItemObj.ItemType = temp 
    AlList.Add(AnItemObj) 
Next 
0

erstellen Sie eine neue Instanz iteminfo für jedes Inkrement der Schleife?

0

Ich kann Ihren vollständigen Schleifencode nicht sehen, aber ich stelle mir vor, die Ursache setzt AnItemObj nicht auf ein neues ItemInfo-Objekt. Sie ändern also das gleiche Objekt und fügen ihm die Liste erneut hinzu (alle Elemente in der Liste verweisen auf dasselbe Objekt).

AnItemObj = New ItemInfo() 
AnItemObj.ItemNo = AFile.RecordId 
AnItemObj.ItemType = temp 
AlList.Add(AnItemObj) 
Verwandte Themen