オブジェクトのVB.NETの配列リストからデータを取得
質問
私は、オブジェクト(.NET 1.1 Frameworkの)のArrayListのから正しい値を取得しようとしています:
私は次のように定義されています:
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を変更し、あなたのリストに同じ項目に別の参照をaddignしている。
あなたが緩くように、各ループ上の新しいオブジェクトを作成する必要があります:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
あなたは、ループの各増分についてiteminfoの新しいインスタンスを作成していますか?
私はあなたの完全なループコードを参照することはできませんが、私は原因は新ItemInfoオブジェクトにAnItemObjを設定されていない想像してみてください。だから、ちょうど同じオブジェクトを変更して、もう一度(同じオブジェクトへのリストのポイントのすべての項目を)リストを、それを追加することになります。
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)