3

私は次の問題で立ち往生しています。Oracle データベースに接続する基本的な GridView のページ化された結果セットを実装しようとしています。単独で、GridView とページングされた結果は正常に機能します。問題は、作業中のページ レイアウト クラスに配置しようとすると発生します。

Page から継承された企業標準である ClassA があります。次に、ClassA から継承し、アプリケーション固有のコードを含む ClassB があります。GridView があるページは、ClassB から継承されます。これは他のページではすべて正常に機能しているようで、それが問題の原因ではないと思いますが、言及したいと思いました.

GridView を含むページが初めて読み込まれると、すべてが正常に表示されます。クエリが実行され、最初の 10 レコードが表示され、ページングの番号が下に表示されます。「2」または他のページをクリックすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージとともに「黄色い画面」が表示されます。そのエラー行で参照されているオブジェクトは "Me"、Page オブジェクト (デバッガーでは ASP.pagename_aspx) です。失敗した正確な行がそれほど重要であるとは思いません。いくつかのステートメントの順序を入れ替えたところ、最初のステートメントで失敗しただけだからです。

デバッガーでトレースしたところ、正常に見えますが、ページ 1 では正常に動作し、ページ 2 では失敗するだけです。

PageIndexChanging イベントを実装しました (ここでも、ClassB から継承を削除すると、単独で機能します。また、ClassA から直接継承しようとすると (ClassB を完全にバイパスします)、まだ問題が発生します。

何か案は?ありがとう。

4

4 に答える 4

1

@DotNetDaddyに同意します。これは、データソースをポストバックに設定する必要があるという点です。これが、死の「楽しい」黄色い画面の理由であることがほぼ確実です。以下は、.NET2.0以降でのGridViewの並べ替えとページングを示す非常に単純な例です。

以下は、このグリッドビューが私のvbコードで正しく機能するために必要な正確なマークアップです。

<asp:GridView ID="gridSuppliers" EnableViewState="false" runat="server" OnPageIndexChanging="gridSuppliers_PageIndexChanging" AutoGenerateColumns="false" AllowPaging="true" AllowSorting="true" CssClass="datatable" CellPadding="0" CellSpacing="0" BorderWidth="0" GridLines="None">...</asp:GridView>

次は、コレクションベースのデータバインドに必要な並べ替え/ページングの実装を含むコードビハインドファイルです。

Partial Public Class _Default
    Inherits System.Web.UI.Page
    Implements ISupplierView

    Private presenter As SupplierPresenter

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        MyBase.OnInit(e)
        presenter = New SupplierPresenter(Me)
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        presenter.OnViewLoad()
    End Sub

    Protected Sub gridSuppliers_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gridSuppliers.PageIndexChanging
        gridSuppliers.PageIndex = e.NewPageIndex
        presenter.PopulateSupplierList()
    End Sub

    Private Sub gridSuppliers_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs) Handles gridSuppliers.Sorting
        If DirectCast(ViewState("PreviousSortExpression"), String) = e.SortExpression Then
            If DirectCast(ViewState("PreviousSortDirection"), String) = "Ascending" Then
                e.SortDirection = System.Web.UI.WebControls.SortDirection.Descending
                ViewState("PreviousSortDirection") = "Descending"
            Else
                e.SortDirection = System.Web.UI.WebControls.SortDirection.Ascending
                ViewState("PreviousSortDirection") = "Ascending"
            End If
        Else
            e.SortDirection = System.Web.UI.WebControls.SortDirection.Ascending
            ViewState("PreviousSortDirection") = "Ascending"
        End If
        ViewState("PreviousSortExpression") = e.SortExpression

        Dim gv As GridView = DirectCast(sender, GridView)
        If e.SortExpression.Length > 0 Then
            For Each field As DataControlField In gv.Columns
                If field.SortExpression = e.SortExpression Then
                    ViewState("PreviousHeaderIndex") = gv.Columns.IndexOf(field)
                    Exit For
                End If
            Next
        End If
        presenter.PopulateSupplierList()
    End Sub

#Region "ISupplierView Properties"
    Private ReadOnly Property PageIsPostBack() As Boolean Implements ISupplierView.PageIsPostBack
        Get
            Return Page.IsPostBack
        End Get
    End Property

    Private ReadOnly Property SortExpression() As String Implements ISupplierView.SortExpression
        Get
            If ViewState("PreviousSortExpression") Is Nothing Then
                ViewState("PreviousSortExpression") = "CompanyName"
            End If
            Return DirectCast(ViewState("PreviousSortExpression"), String)
        End Get
    End Property

    Public ReadOnly Property SortDirection() As String Implements Library.ISupplierView.SortDirection
        Get
            If ViewState("PreviousSortDirection") Is Nothing Then
                ViewState("PreviousSortDirection") = "Ascending"
            End If
            Return DirectCast(ViewState("PreviousSortDirection"), String)
        End Get
    End Property

    Public Property Suppliers() As System.Collections.Generic.List(Of Library.Supplier) Implements Library.ISupplierView.Suppliers
        Get
            Return DirectCast(gridSuppliers.DataSource(), List(Of Supplier))
        End Get
        Set(ByVal value As System.Collections.Generic.List(Of Library.Supplier))
            gridSuppliers.DataSource = value
            gridSuppliers.DataBind()
        End Set
    End Property
#End Region

End Class

そして最後に、コードビハインドで使用されるプレゼンタークラス

Public Class SupplierPresenter
    Private mView As ISupplierView
    Private mSupplierService As ISupplierService

    Public Sub New(ByVal View As ISupplierView)
        Me.New(View, New SupplierService())
    End Sub

    Public Sub New(ByVal View As ISupplierView, ByVal SupplierService As ISupplierService)
        mView = View
        mSupplierService = SupplierService
    End Sub

    Public Sub OnViewLoad()
        If mView.PageIsPostBack = False Then
            PopulateSupplierList()
        End If
    End Sub

    Public Sub PopulateSupplierList()
        Try
            Dim SupplierList As List(Of Supplier) = mSupplierService.GetSuppliers()
            SupplierList.Sort(New GenericComparer(Of Supplier)(mView.SortExpression, mView.SortDirection))
            mView.Suppliers = SupplierList
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
End Class

**プレゼンターで参照されるジェネリックコレクションをソートするために必要なクラス

Imports System.Reflection
Imports System.Web.UI.WebControls

Public Class GenericComparer(Of T)
    Implements IComparer(Of T)

    Private mDirection As String
    Private mExpression As String

    Public Sub New(ByVal Expression As String, ByVal Direction As String)
        mExpression = Expression
        mDirection = Direction
    End Sub

    Public Function Compare(ByVal x As T, ByVal y As T) As Integer Implements System.Collections.Generic.IComparer(Of T).Compare
        Dim propertyInfo As PropertyInfo = GetType(T).GetProperty(mExpression)
        Dim obj1 As IComparable = DirectCast(propertyInfo.GetValue(x, Nothing), IComparable)
        Dim obj2 As IComparable = DirectCast(propertyInfo.GetValue(y, Nothing), IComparable)
        If mDirection = "Ascending" Then
            Return obj1.CompareTo(obj2)
        Else
            Return obj2.CompareTo(obj1)
        End If
    End Function
End Class
于 2008-10-12T20:42:43.497 に答える
1

ベース (例では ClassA) にすべてのページング ビットと並べ替えビットを処理するように設定された変数があり、GridView がそれらの変数を使用するイベントに接続されている、同様の状況に遭遇しました。私のページで適切な基本クラス変数を設定しないと、まったく同じ種類のエラーが発生しました。

于 2008-09-23T15:47:26.510 に答える
1

過去に同様の問題が発生したときは、通常、データバインディングの問題でした (適切なタイミングで DataBind() を呼び出さないため、次のページを見ようとすると DataSource が null になります)。

于 2008-09-23T16:05:42.080 に答える
0

この質問を投稿するために使用した元の未登録のログインを失いました。

とにかく、ハーパーシェルビーの答えは正しいことが判明しました。その基本クラス(当社の企業標準であるカスタムオブジェクト)に未設定の変数があり、問題を引き起こしました(そして有用なエラーメッセージはありませんでした)。

管理者または適切な権限を持つ誰かがこれを確認した場合は、ハーパーの回答を1つとしてマークし、これを閉じることができます。みんなの助けに感謝します。

于 2008-10-29T20:05:18.877 に答える