Получение данных из массива объектов VB.NET
Вопрос
Я пытаюсь получить правильное значение из объекта ArrayList (.NET 1.1 Framework):
У меня определено следующее:
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 последнего значения в списке.
Что мне не хватает?
Решение
Поместите следующий код:
Dim AnItemObj As New ItemInfo
внутри цикл, который добавляет AnItemObj в список.
Когда вы добавляете тип ссылки в список, вы добавляете только ссылку, а не значение.
Это означает, что если вы добавите в список 10 раз один и тот же экземпляр, в список будет добавлена 10 раз одна и та же ссылка.Но если после этого у вас все еще будет ссылка на этот экземпляр, вы можете изменить его свойства, и поскольку все 10 записей в списке указывают на одну и ту же ссылку в памяти, все 10 записей будут изменены.
Другие советы
Итак, у вас есть:
Dim AnItemObj As New ItemInfo
For ...
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Здесь происходит следующее: вы создаете один объект, устанавливаете для него значения и добавляете ссылку на него в свой список.Затем вы меняете свою ItemInfo и добавляете в свой список еще одну ссылку на тот же элемент.
Вам нужно создать новый объект в каждом цикле, примерно так:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Вы создаете новый экземпляр iteminfo для каждого приращения цикла?
Я не вижу вашего полного кода цикла, но полагаю, что причина не в установке AnItemObj в объект New ItemInfo.Таким образом, вы просто изменяете один и тот же объект и снова добавляете его в список (все элементы в списке указывают на один и тот же объект).
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)