【问题标题】:VB.Net exception: Object reference not set to an instance of an objectVB.Net 异常:对象引用未设置为对象的实例
【发布时间】:2013-05-11 00:43:40
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试过在调试器中暂停时将鼠标悬停在语句中的变量上以找出哪个是Nothing?这是一个很好的起点。
  • 好的,我刚刚试了一下,在错误突出显示的所有代码中,artTable 当前是Nothing
  • 是 ArtID 数字字段吗?
  • 是的,ArtID在数据库中有一个整数类型的列
  • ddlArt.DataBind() 的数据源在哪里?页面加载时下拉菜单中有任何选定的值吗?

标签: asp.net sql vb.net


【解决方案1】:

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

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

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

解决此问题的一种方法(在不知道您的 SqlDataSource 的情况下很难给出准确的答案)是修改您的页面加载方法,以便仅在用户从下拉列表中选择一个项目时调用 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

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

【讨论】:

  • 啊哈!将所有内容放在ddlArt.SelectedIndexChanged 事件处理程序下似乎可以解决问题。感谢您的宝贵时间!
【解决方案2】:

可能是 .. 以 ArtID 作为整数

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

【讨论】:

  • 嗯,刚刚试过了,我仍然遇到同样的错误。我尝试了 CInt 类型转换,也尝试了 ToString() 方法,但它们都没有工作。
  • 回复:您的编辑...也不是这样。我知道我们已经很接近了——我记得我之前遇到错误时使用了几乎相同的线路,但我就是不记得我做了什么......
猜你喜欢
  • 2013-12-30
  • 1970-01-01
  • 2013-01-14
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多