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 に答える