質問

私は、オブジェクト(.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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top