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

Vb.net Visual Basic-ReDim Preserve-对象引用未设置为对象的实例,vb.net,Vb.net,我对编程非常陌生,并尝试编写一个程序,它从txt文件中读取有关房地产的数据,并可以选择在txt文件的其余属性下的新行中添加另一个属性 这是目前正在处理阵列的ReDim的子组件: Private Sub ExitSetTexts() Dim propertyId As String = arrListings(UBound(arrListings)).propertyId ReDim Preserve arrListings(UBound(arrListings) + 1)

我对编程非常陌生,并尝试编写一个程序,它从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,上面写着“附加信息:对象引用未设置为对象的实例”,并突出显示这一行:

arrListings(UBound(arrListings)).address = txtAddress.Text
我假设ReDim没有按预期工作,因为如果我将其更改为(UBound(arrListings)-1),那么它将在最后一行的顶部完全重写新信息,但我无法让它在新行上写入

任何指导都将不胜感激

谢谢

编辑:

忘记添加我声明数组的部分。我觉得我这样做是相当狡猾的,但这是我想到的第一个方法,而且似乎奏效了

主要是这样,

Private listings() As Listing
模块中的进一步功能是该功能

Public Function getListings() As Listing()

    Return listings
End Function
在frmListings的顶部,我声明了第二个数组

Private arrListings() As Listing
frmListings然后在frmListings_加载时调用此函数,如下所示

arrListings = getListings()
然后,在结束时,当您关闭表单时,将调用第二个子数组,该子数组使用第二个数组中更改的数据替换原始数组中的数据

像这样,

setListings(arrListings)

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

它非常混乱,但我无法从表单中了解如何使用模块中的数组,所以我就是这样做的。

当调整数组大小时,新元素默认为零,因此在使用它们之前需要将它们设置为:

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


更好的答案是使用
私有arrListings作为新列表(列表)
,但这需要对代码进行大量更改,以便将其保留为数组。

调整数组大小时,新元素默认为零,因此在使用它们之前需要将它们设置为:

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


更好的答案是使用
私有arrListings作为新列表(列表)
,但这需要对代码进行大量更改,以便将其保留为数组。

是否声明了arrListings?如果是这样的话,你能给我们看一下那部分代码吗?你声明了吗?如果是这样的话,你能给我们看一下那部分代码吗。Slai回答正确。不确定为什么,但使用Len不起作用,所以我将其保留为UBound,工作完美,非常感谢。Slai回答正确。不确定为什么,但使用Len不起作用,所以我将其保留为UBound,工作完美,非常感谢。