7

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

4 回答 4

5

输入以下代码:

Dim AnItemObj As New ItemInfo

将 AnItemObj 添加到列表的循环中。

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

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

于 2009-06-30T08:01:41.243 回答
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
于 2009-06-30T08:03:01.833 回答
0

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

于 2009-06-30T08:03:15.250 回答
0

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

AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
于 2009-06-30T08:06:26.663 回答