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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top