0

私は現在、学校のプロジェクトの Web ページのコーディングに取り組んでいます。このサイトは、アートワークのプリントを注文できるシンプルなオンライン ストアであるはずです。私が取り組んでいる特定のページには、データベースにバインドされたドロップダウン リスト (ddlArt) があり、利用可能なさまざまなアート作品のリストが表示されます。ユーザーがアイテムの 1 つを選択すると、そのアイテムに関するすべての情報がデータベースから取得され、さまざまなラベルなどでページに表示されます。唯一のことは、ページを実行しようとすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という null 参照例外エラーが発生することです。今年の初めに宿題で同じエラーが発生し、なんとか修正できましたが、何をしたか思い出せず、来週まで学校から助けを得ることができないので、私は思った. ここで私の運を試してください。これが私のコードです:

    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 & "'"、GetSelectedArt 関数の行が強調表示されます。私が言及した修正された宿題と比較してみましたが、問題が見つからないようです. 実際にクラスを受講してからしばらく経っているため、私の VB は少しぼやけています。助言がありますか?本当にありがとう!

4

2 に答える 2

1

上記のコメントを正しく理解している場合ddlArt、ユーザーは最初にアート タイプを選択する必要があるため、最初のページ ロードでは には何もありません。

それが正しければ、私の質問に対するあなたの答えがあなたの答えです。

なんらかの理由で (少なくともSelectステートメントを表示せずに)artTblがインスタンス化されていないため、Object reference not set to an instance of an objectエラーが表示されます。

これを修正する方法の 1 つは (SqlDataSource正確な回答を提供するのが難しいことを知らずに) GetSelectedArt、ユーザーがドロップダウン リストから項目を選択した場合にのみ呼び出されるように Page Load メソッドを変更することです。現在、ページが読み込まれるたび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このようにして、有効なfromを持っている (または持つべき) ことがわかりますddlArt

また、ユーザーがラジオ ボタン リストからアート タイプを選択するまでドロップ ダウンを設定しない場合、最初のページの読み込み時にドロップ ダウン リストをバインドするのはなぜですか (そして何にバインドします)? それとも、ドロップダウン リストと詳細情報は、ラジオ ボタン リストとは別のページにありますか?

于 2013-05-11T07:15:22.150 に答える