繁体   English   中英

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

[英]VB.Net exception: Object reference not set to an instance of an object

我目前正在为学校项目的网页编码。 该网站应该是一个简单的在线商店,人们可以在其中订购艺术品的印刷品。 我正在处理的特定页面具有一个下拉列表(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

如果有人感兴趣,这是Art类的代码:

    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

当我收到错误消息时,它将在artTable.RowFilter = "ArtID = '" & ddlArt.SelectedValue & "'"突出显示artTable.RowFilter = "ArtID = '" & ddlArt.SelectedValue & "'"行。 我尝试将其与我提到的更正后的家庭作业进行比较,但似乎找不到问题。 我的VB有点模糊,因为自从我上课以来已经有一段时间了。 有什么建议么? 谢谢一群!

如果我正确理解了您的上述评论,则在初始页面加载时ddlArt没有任何ddlArt ,因为用户必须首先选择一种艺术类型。

如果是正确的话,那么您对我的问题的答案就是您的答案。

无论出于何种原因(至少没有看到Select语句),都不会实例化artTbl ,这就是为什么您看到Object reference not set to an instance of an object错误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) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM