2009-06-30 13 views
7

sto cercando di recuperare il valore corretto da un ArrayList di oggetti (.NET 1.1 Framework):Recupero dati da un arraylist VB.NET di oggetti

Ho il seguente: definiti

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 di evento Form_Load contiene:

Dim AnItemObj As New ItemInfo 

Poi un ciclo che include:

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

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

MsgBox(AlList(5).ItemNo) 

Ho sempre trovato l'ITEMNO dell'ultimo valore nell'elenco.

Cosa mi manca?

+1

Per un principiante, questa domanda è molto ben formattata e presentata. +1 – Cerebrus

risposta

5

mettere 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 aggiunge solo il riferimento, non il valore.

Ciò significa che se si aggiunge 10 volte la stessa istanza a un elenco, verrà aggiunto 10 volte lo stesso riferimento all'elenco. Ma se in seguito hai ancora un riferimento a questa istanza puoi modificarne le proprietà e dato che tutte le 10 voci della lista puntano allo stesso riferimento in memoria, tutte e 10 le voci saranno modificate.

+0

Mi picchia! +1 – Cerebrus

1

Quindi, hai:

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

Quello che sta accadendo qui è che si sta creando un singolo oggetto, l'impostazione dei valori su di esso, e l'aggiunta di un riferimento ad esso, alla vostra lista. Si sta quindi cambiando il tuo ItemInfo e addign un altro riferimento alla stessa voce alla tua lista

è necessario costruire un nuovo oggetto per ogni ciclo, senza bloccare in tal modo:

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

Si sta creando una nuova istanza di iteminfo per ogni incremento del ciclo?

0

Non riesco a vedere il codice di loop completo ma immagino che la causa non stia impostando AnItemObj su un nuovo oggetto ItemInfo. Quindi finisci per modificare lo stesso oggetto e aggiungerlo di nuovo all'elenco (tutti gli elementi nell'elenco puntano allo stesso oggetto).

AnItemObj = New ItemInfo() 
AnItemObj.ItemNo = AFile.RecordId 
AnItemObj.ItemType = temp 
AlList.Add(AnItemObj) 
Problemi correlati