Domanda

Sto cercando di recuperare il valore corretto da un ArrayList di oggetti (.NET 1.1 Framework):

Ho definito quanto segue:

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

Il codice evento form_load contiene:

Dim AnItemObj As New ItemInfo

Quindi un ciclo che include:

AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)

Quindi ora dovrei avere un ArrayList di questi oggetti, tuttavia se provo a recuperare i dati:

MsgBox(AlList(5).ItemNo)

Ottengo sempre l'ItemNo dell'ultimo valore nell'elenco.

Cosa mi manca?

È stato utile?

Soluzione

Inserire il codice seguente:

Dim AnItemObj As New ItemInfo

all'interno il ciclo che aggiunge AnItemObj alla lista.

Quando si aggiunge un tipo di riferimento a un elenco, si sta solo aggiungendo il riferimento, non il valore.

Questo significa che se si aggiungono 10 volte la stessa istanza a un elenco, che aggiungerà 10 volte lo stesso riferimento alla lista. Ma se dopo avete ancora un riferimento a questa istanza è possibile modificarne le proprietà e, come tutte le 10 voci nella lista punto per lo stesso riferimento in memoria, tutte le 10 voci saranno modificati.

Altri suggerimenti

Quindi, hai:

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

Quello che succede qui è che stai creando un singolo oggetto, impostando i valori su di esso e aggiungendo un riferimento ad esso al tuo elenco.Stai quindi modificando il tuo ItemInfo e aggiungendo un altro riferimento allo stesso articolo al tuo elenco

È necessario costruire un nuovo oggetto su ogni ciclo, liberamente in questo modo:

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

Stai creando una nuova istanza di ItemInfo per ogni incremento del ciclo?

Non riesco a vedere il tuo codice ciclo completo ma immagino la causa non è l'impostazione AnItemObj a un oggetto nuovo ItemInfo. Così si finisce per modificare lo stesso oggetto e aggiungendolo alla lista di nuovo (tutti gli elementi nella lista punto allo stesso oggetto).

AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top