Получение данных из массива объектов VB.NET - PullRequest
7 голосов
/ 30 июня 2009

Я пытаюсь получить правильное значение из 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 из последнего значения в списке.

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

Ответы [ 4 ]

5 голосов
/ 30 июня 2009

Введите следующий код:

Dim AnItemObj As New ItemInfo

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

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

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

1 голос
/ 30 июня 2009

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

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
0 голосов
/ 30 июня 2009

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

AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
0 голосов
/ 30 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...