题
我试图从对象的ArrayList检索正确的值(.NET 1.1框架):
我有以下定义:
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)
我总是在列表的最后一个值的货号。
我是什么失踪?
解决方案
将以下代码:
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和addign到列表中的另一个引用同一项目
您需要构造在每个循环一个新对象,因此松散:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
您为循环的每个增量创建iteminfo的新实例?
我看不到完整的循环代码,但我想象的原因是没有设置AnItemObj到一个新的ItemInfo对象。所以,你只是最终修改同一个对象,然后重新添加的列表(列表中的点所有的项目都相同的对象)。
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
不隶属于 StackOverflow