从VB.NET对象的arraylist中检索数据

时间:2009-06-30 07:54:35

标签: vb.net arraylist

我正在尝试从对象的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 个答案:

答案 0 :(得分:5)

输入以下代码:

Dim AnItemObj As New ItemInfo

内部将AnItemObj添加到列表的循环。

将引用类型添加到列表时,只添加引用,而不是值。

这意味着如果将相同实例的10倍添加到列表中,它将向列表添加相同引用的10倍。但是如果之后你仍然有对这个实例的引用,你可以修改它的属性,并且由于列表中的所有10个条目都指向内存中的相同引用,所有10个条目都将被修改。

答案 1 :(得分:1)

所以,你有:

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

答案 2 :(得分:0)

您是否为循环的每个增量创建了一个新的iteminfo实例?

答案 3 :(得分:0)

我看不到你的完整循环代码,但我想原因是没有将AnItemObj设置为New ItemInfo对象。因此,您最终会修改同一个对象并再次将其添加到列表中(列表中的所有项目都指向同一个对象)。

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