Получение данных из массива объектов VB.NET

StackOverflow https://stackoverflow.com/questions/1062320

  •  21-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить правильное значение из объекта 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top