문제

객체의 배열 목록 (.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)

이제이 객체의 배열 목록이 있어야하지만 데이터를 검색하려고하면 다음과 같습니다.

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를 변경하고 같은 항목에 대한 다른 참조를 목록에 추가합니다.

각 루프에 새 개체를 건설해야합니다.

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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top