2009-06-30 5 views
7

я пытаюсь получить правильное значение из ArrayList объектов (.NET 1.1 Framework):Извлечение данных из VB.NET ArrayList объектов

я следующее: определенные

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 

код Form_Load событие содержит:

Dim AnItemObj As New ItemInfo 

Затем цикл, который включает в себя:

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

Так что я теперь должен иметь ArrayList этих объектов, однако при попытке извлечь данные:

MsgBox(AlList(5).ItemNo) 

Я всегда получаю ITEMNO последнего значения в списке.

Что мне не хватает?

+1

Для новичков этот вопрос очень хорошо отформатирован и представлен. +1 – Cerebrus

ответ

5

Поместите следующий код:

Dim AnItemObj As New ItemInfo 

внутри цикла, который добавляет AnItemObj к списку.

Когда вы добавляете ссылочный тип в список, вы добавляете только ссылку, а не значение.

Это означает, что если вы добавите в 10 экземпляров один и тот же экземпляр в список, он добавит 10 раз к той же ссылке на список. Но если после этого вы все еще имеете ссылку на этот экземпляр, вы можете изменить его свойства, и поскольку все 10 записей в списке указывают на одну и ту же ссылку в памяти, все 10 записей будут изменены.

+0

Ударьте меня! +1 – Cerebrus

1

Итак, у вас есть:

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

Что здесь происходит, вы создаете один объект, устанавливая значения на нем, и добавив ссылку на него, в свой список. Вы затем изменить свой ItemInfo и addign другую ссылку на тот же товар в список

Вам нужно создать новый объект на каждой петле, свободно, таким образом:

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

Вы создаете новый экземпляр iteminfo для каждого приращения цикла?

0

Я не вижу ваш полный код цикла, но я полагаю, что причиной не является установка AnItemObj в объект New ItemInfo. Таким образом, вы просто вносите изменения в один и тот же объект и снова добавляете его (все элементы в списке указывают на один и тот же объект).

AnItemObj = New ItemInfo() 
AnItemObj.ItemNo = AFile.RecordId 
AnItemObj.ItemType = temp 
AlList.Add(AnItemObj) 
Смежные вопросы