VB.Net异常:对象引用未设置为对象的实例



我目前正在为一个学校项目编写一个网页。这个网站应该是一个简单的网上商店,人们可以在那里订购艺术品的印刷品。我正在处理的特定页面有一个下拉列表(ddlArt),它绑定到我的数据库,并显示可用的不同艺术作品的列表。当用户选择其中一个项目时,该项目的所有信息都将从数据库中提取出来,并以各种标签等形式显示在页面上。唯一的事情是,当我去尝试运行页面时,我得到一个空引用异常错误说"对象引用未设置为对象的实例"。我在今年早些时候的家庭作业中也犯了同样的错误,并设法把它修好了,但我不记得我做了什么,我要到下周才能从学校得到帮助,所以我想我要在这里试试运气。下面是我的代码:

    Private selectedArt As Art
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)     Handles Me.Load
        If Not IsPostBack Then
            ddlArt.DataBind()
        End If
        selectedArt = Me.GetSelectedArt
        lblArtID.Text = selectedArt.ArtID()
        lblArtName.Text = selectedArt.ArtName()
        lblCaption.Text = selectedArt.Caption()
        lblDescription.Text = selectedArt.Description()
        imgArt.ImageUrl = "~/images/" & selectedArt.FileName()
    End Sub

    Private Function GetSelectedArt() As Art
        Dim artTable As DataView = CType(SqlDataSource1.Select(DataSourceSelectArguments.Empty), DataView)
        artTable.RowFilter = "ArtID = '" & ddlArt.SelectedValue & "'"
        Dim artRow As DataRowView = artTable(0)
        Me.imgArt.ImageUrl = "~/images/" & artRow("FileName")
        Dim art As New Art
        art.ArtID = artRow("ArtID").ToString
        art.ArtName = artRow("ArtName").ToString
        art.Caption = artRow("Caption").ToString
        art.Description = artRow("LongDescription").ToString
        art.FileName = artRow("FileName").ToString
        Return art
    End Function

这里是艺术类的代码,如果有人感兴趣的话:

    Public Class Art
        Public Property ArtID As Integer
        Public Property ArtName As String
        Public Property ArtType As String
        Public Property Caption As String
        Public Property FileName As String
        Public Property Description As String
    End Class

当我得到错误时,它突出显示了GetSelectedArt函数中的artTable.RowFilter = "ArtID = '" & ddlArt.SelectedValue & "'"行。我试着把它和我刚才提到的批改后的家庭作业做比较,但我似乎找不到问题。我的VB有点模糊,因为我上这门课已经有一段时间了。有什么建议吗?非常感谢!

如果我理解正确的话,在初始页面加载时,ddlArt中没有任何内容,因为用户必须首先选择美术类型。

如果这是正确的,那么你对我问题的回答就是你的答案。

无论出于何种原因(并且至少没有看到Select语句),artTbl没有被实例化,这就是为什么您看到Object reference not set to an instance of an object错误。

解决这个问题的一种方法(不知道你的SqlDataSource很难给出一个精确的答案)是修改你的Page Load方法,这样GetSelectedArt只在用户从下拉列表中选择一个项目时被调用。现在GetSelectedArt在每次加载页面时都被调用

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)     Handles Me.Load
    If Not IsPostBack Then
        ddlArt.DataBind()
    Else
        selectedArt = Me.GetSelectedArt
        lblArtID.Text = selectedArt.ArtID()
        lblArtName.Text = selectedArt.ArtName()
        lblCaption.Text = selectedArt.Caption()
        lblDescription.Text = selectedArt.Description()
        imgArt.ImageUrl = "~/images/" & selectedArt.FileName()
    End If
End Sub

但是,上面的修改只会阻止GetSelectedArt在初始页面加载时被调用。如果您的SqlDataSource.Select命令仍然没有返回任何内容,那么您仍然会遇到这个问题。

更好的解决方案是在ddlArt.SelectedIndexChanged事件处理程序上调用GetSelectedArt。这样你就知道你有(或者应该有)一个来自ddlArt的有效SelectedValue

此外,如果你在用户从单选按钮列表中选择美术类型之前不填充下拉列表,为什么要在初始页面加载时绑定下拉列表(以及将绑定到的内容)?还是下拉列表和详细信息位于与单选按钮列表不同的页面上?

可能是…其中ArtID为整数

artTable.RowFilter = "ArtID = " & format(ddlArt.SelectedValue) 

最新更新