3

我遇到了以下问题。我正在尝试实现一个基本的 GridView 分页结果集,它连接到 Oracle 数据库。GridView 和分页结果本身可以正常工作。当我尝试将它放在我们工作的页面布局类中时,问题就来了。

我们有 ClassA,它继承自 Page,是一个企业标准。然后我有 ClassB,它继承自 ClassA 并包含特定于应用程序的代码。GridView 所在的页面继承自 ClassB。这一切似乎在其他页面上都可以正常工作,我认为这不是问题的根源,但我想我会提到它。

发生的情况是,第一次加载 GridView 的页面时,一切看起来都很正常。查询运行并显示前 10 条记录,下面是用于分页的数字。当我单击“2”或任何其他页面时,我会看到“黄屏死机”并显示以下消息:“对象引用未设置为对象的实例”。该错误行中引用的对象是“我”,即页面对象(调试器中的 ASP.pagename_aspx)。我不相信它失败的确切行是那么重要,因为我已经改变了一些语句的顺序,它只是在最早的一个上失败了。

我已经使用调试器进行了跟踪,它看起来很正常,只有在第 1 页上它工作正常,而在第 2 页上它失败了。

我已经实现了 PageIndexChanging 事件(同样,如果我从 ClassB 中删除继承,它会自行工作。另外,如果我尝试直接从 ClassA 继承(完全绕过 ClassB),我仍然会遇到问题。

有任何想法吗?谢谢。

4

4 回答 4

1

我遇到了类似的情况,其中基(在您的示例中为 ClassA)具有设置为处理所有分页和排序位的变量,并且 GridView 连接到使用这些变量的事件。没有在我的页面中设置正确的基类变量会导致完全相同的错误。

于 2008-09-23T15:47:26.510 回答
1

当我过去遇到类似问题时,通常是数据绑定问题(没有在正确的时间调用 DataBind(),因此当它尝试查看下一页时,DataSource 为空)。

于 2008-09-23T16:05:42.080 回答
1

我同意@DotNetDaddy 的观点,因为您需要确保在回发时设置数据源,因为这几乎肯定是“有趣”的黄屏死机的原因。下面是一个非常简单的示例,显示了 .NET 2.0+ 中 GridView 的排序和分页

以下是此 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 回答
0

我丢失了用于发布此问题的原始未注册登录名。

无论如何,哈珀谢尔比的回答被证明是正确的。该基类中有一个未设置的变量(我们公司标准的自定义对象)导致了问题(并且没有有用的错误消息)。

如果管理员或具有正确权力的人看到此内容,您可以将 Harper 的答案标记为该答案,然后关闭它。感谢大家的帮助。

于 2008-10-29T20:05:18.877 回答