2016-09-11 41 views
0

我很新的編程和嘗試編寫一個程序,它從txt文件讀取有關房地產屬性的數據,並且可以選擇添加在txt文件的其餘屬性下的新行上的另一個屬性。Visual Basic - ReDim保留 - 對象引用未設置爲對象的實例

這是次處理陣列的使用ReDim此刻:

Private Sub ExitSetTexts() 

    Dim propertyId As String = arrListings(UBound(arrListings)).propertyId 

    ReDim Preserve arrListings(UBound(arrListings) + 1) 
    arrListings(UBound(arrListings)).address = txtAddress.Text 
    arrListings(UBound(arrListings)).city = txtCity.Text 
    arrListings(UBound(arrListings)).state = txtState.Text 
    arrListings(UBound(arrListings)).postcode = txtPostcode.Text 

    If rbHouse.Checked = True Then 
     arrListings(UBound(arrListings)).type = "H" 
    ElseIf rbUnit.Checked = True Then 
     arrListings(UBound(arrListings)).type = "U" 
    ElseIf rbAcreage.Checked = True Then 
     arrListings(UBound(arrListings)).type = "A" 

    End If 

    arrListings(UBound(arrListings)).bedrooms = txtBedrooms.Text 
    arrListings(UBound(arrListings)).salePrice = txtSalePrice.Text 


    propertyId = CInt(propertyId.Trim.Remove(0, 1)) 
    propertyId = CInt(propertyId) + 1 
    propertyId = CInt(propertyId).ToString("D4") 
    propertyId = " P" + propertyId 
    arrListings(UBound(arrListings)).propertyId = propertyId 


End Sub 

當我運行程序,輸入所有的細節,然後點擊運行此代碼的按鈕,它拋出一個NullReferenceException說:「其他信息:對象引用不設置到對象的實例」,並強調這一行:

arrListings(UBound(arrListings)).address = txtAddress.Text 

我相信如預期,因爲如果我將其更改爲(UBound函數(arrListings)使用ReDim不工作 - 1 ),那麼它會重寫新的信息最後一行非常好,但我不能把它寫在一個新的行。

任何指導將不勝感激,

謝謝。

編輯:

忘了補充,其中我聲明數組的部分。我覺得我做這件事的方式相當狡猾,但這是我想到的第一種方式,它似乎起作用。

在modMain是這樣的;

Private listings() As Listing 

進一步在模塊中是這個功能;

Public Function getListings() As Listing() 

    Return listings 
End Function 

在frmListings的頂部,我聲明瞭第二個數組;

Private arrListings() As Listing 

frmListings然後像這樣在frmListings_Load上調用這個函數;

arrListings = getListings() 

然後,在結束時關閉窗體是調用它取代了原來陣列與所述第二陣列中的改變的數據在數據中的第二子。

像這樣;

setListings(arrListings) 

Public Sub setListings(ByVal arrListings()) 
    listings = arrListings 
End Sub 

這是非常混亂,但我不知道如何從窗體中使用模塊中的數組,所以我只是這樣做。

+0

您是否聲明瞭arrListings?如果是這樣,你能告訴我們那部分代碼嗎? –

回答

2

當調整陣列中,新元素在默認情況下沒有什麼,所以你需要將它們設置爲東西在使用之前:

ReDim Preserve arrListings(arrListings.Length) 
arrListings(UBound(arrListings)) = New Listing 
arrListings(UBound(arrListings)).address = txtAddress.Text 
... 

Private Sub ExitSetTexts() 

    Dim list = New Listing 
    list.address = txtAddress.Text 
    ... 
    list.propertyId = propertyId 

    ReDim Preserve arrListings(arrListings.Length) 
    arrListings(UBound(arrListings)) = list 

End Sub 

一個更好的答案是要使用Private arrListings As New List(Of Listing),但這需要在代碼中進行很多更改,因此更容易將其作爲數組保留。

+0

Slai已正確回答。 –

+0

不知道爲什麼,但使用Len沒有工作,所以我保持它作爲UBound,完美的作品,非常感謝你。 –

相關問題