2009-06-30 8 views
7

Tôi cố gắng để lấy lại giá trị chính xác từ một ArrayList của các đối tượng (.NET 1.1 Framework):Lấy dữ liệu từ một ArrayList VB.NET của các đối tượng

Tôi có định nghĩa sau đây:

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 

mã sự kiện Form_Load chứa:

Dim AnItemObj As New ItemInfo 

Sau đó, một vòng lặp bao gồm:

AnItemObj.ItemNo = AFile.RecordId 
AnItemObj.ItemType = temp 
AlList.Add(AnItemObj) 

Vì vậy, bây giờ tôi cần phải có một ArrayList của các đối tượng này, tuy nhiên nếu tôi cố gắng để lấy dữ liệu:

MsgBox(AlList(5).ItemNo) 

tôi luôn luôn nhận được ItemNo giá trị cuối cùng trong danh sách.

Tôi đang thiếu gì?

+1

Đối với người mới, câu hỏi này được định dạng và trình bày rất tốt. +1 – Cerebrus

Trả lời

5

Đặt đoạn mã sau:

Dim AnItemObj As New ItemInfo 

bên vòng lặp mà thêm AnItemObj vào danh sách.

Khi bạn thêm một kiểu tham chiếu đến một danh sách, bạn chỉ việc thêm các tài liệu tham khảo, không phải là giá trị.

Điều này có nghĩa rằng nếu bạn thêm 10 lần so với ví dụ tương tự vào một danh sách, nó sẽ bổ sung thêm 10 lần so với tài liệu tham khảo cùng vào danh sách. Nhưng nếu sau đó bạn vẫn có một tham chiếu đến cá thể này, bạn có thể sửa đổi các thuộc tính của nó và như tất cả 10 mục trong danh sách trỏ đến cùng một tham chiếu trong bộ nhớ, tất cả 10 mục sẽ được sửa đổi.

+0

Đánh tôi với nó! +1 – Cerebrus

1

Vì vậy, bạn đã có:

Dim AnItemObj As New ItemInfo 
For ... 
    AnItemObj.ItemNo = AFile.RecordId 
    AnItemObj.ItemType = temp 
    AlList.Add(AnItemObj) 
Next 

gì đang xảy ra ở đây là bạn đang tạo ra một đối tượng duy nhất, thiết lập các giá trị vào nó, và thêm một tham chiếu đến nó, vào danh sách của bạn. Sau đó bạn đang thay đổi ItemInfo của bạn và addign khác tham chiếu đến cùng một mục vào danh sách

Bạn cần phải xây dựng một đối tượng mới trên mỗi vòng lặp, lỏng lẻo như sau:

Dim AnItemObj As ItemInfo 
For ... 
    AnItemObj = New ItemInfo 
    AnItemObj.ItemNo = AFile.RecordId 
    AnItemObj.ItemType = temp 
    AlList.Add(AnItemObj) 
Next 
0

Bạn có tạo ra một thể hiện mới của iteminfo cho mỗi gia số của vòng lặp?

0

Tôi không thể nhìn thấy mã vòng lặp đầy đủ của bạn nhưng tôi tưởng tượng ra nguyên nhân không được thiết lập AnItemObj đến một đối tượng mới ItemInfo. Vì vậy, bạn chỉ cần kết thúc sửa đổi cùng một đối tượng và thêm nó vào danh sách một lần nữa (tất cả các mục trong danh sách trỏ đến cùng một đối tượng).

AnItemObj = New ItemInfo() 
AnItemObj.ItemNo = AFile.RecordId 
AnItemObj.ItemType = temp 
AlList.Add(AnItemObj)