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

时间:2013-05-11 00:43:40

标签: asp.net sql 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有点模糊,因为我实际参加课程已经有一段时间了。有什么建议?非常感谢!

2 个答案:

答案 0 :(得分: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命令仍未返回任何内容,那么您仍然会遇到此问题。

更好的解决方案将调用GetSelectedArt事件处理程序上的ddlArt.SelectedIndexChanged。通过这种方式,您可以知道自己(或应该)拥有来自SelectedValue的有效ddlArt

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

答案 1 :(得分:0)

可能是..使用ArtID作为整数

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