Visual Basic - ReDim Preserve - 未将对象引用设置为对象的实例

时间:2016-09-11 03:05:02

标签: vb.net

我是编程并尝试编写程序的新手,它从txt文件中读取有关房地产属性的数据,并且可以选择在txt文件中的其余属性下的新行上添加另一个属性

这是目前处理数组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,说“附加信息:对象引用未设置为对象的实例”并突出显示以下行:< / p>

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

我认为ReDim没有按预期工作,因为如果我将它更改为(UBound(arrListings) - 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

它非常混乱,但我无法弄清楚如何在表单模块中使用数组,所以我就这样做了。

1 个答案:

答案 0 :(得分:2)

当您调整数组大小时,默认情况下新元素为Nothing,因此您需要在使用之前将它们设置为某些内容:

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),但这需要对代码进行大量更改,因此更容易将其保留为数组。