Gridview updatepanel排序对象引用未设置为对象的实例

时间:2012-06-07 18:53:18

标签: asp.net updatepanel

我正在尝试在updatepanel中对gridview进行排序。它编译,但我收到Object reverence not set to an instance of an object错误。我试图遵循这个guide,但是在vb

的Default.aspx

 <ajx:UpdatePanel ID="ajaxpanel" runat="server">   
    <ContentTemplate>         
                <asp:GridView ID="gvProgramDetails" runat="server" AutoGenerateColumns="False" 
                    CssClass="gridview" DataKeyNames="ProgramNumber" 
             AllowPaging="True" PageSize="2" AllowSorting="True" OnSorting="gvProgramDetails_Sorting">
                    <Columns>
                        <asp:CommandField ControlStyle-CssClass="button delete" ShowDeleteButton="True">
                            <ControlStyle CssClass="button delete" />
                        </asp:CommandField>
                        <asp:CommandField ControlStyle-CssClass="button save" ShowEditButton="True">
                            <ControlStyle CssClass="button save" />
                        </asp:CommandField>
                        <asp:BoundField DataField="ProgramNumber" HeaderText="ProgramNumber" 
                            InsertVisible="False" ReadOnly="True" SortExpression="ProgramNumber" />
                        <asp:BoundField DataField="ProgramName" HeaderText="ProgramName" 
                            SortExpression="ProgramName" />
                        <asp:BoundField DataField="ProgramStatus" HeaderText="ProgramStatus" 
                            SortExpression="ProgramStatus" />
                        <asp:BoundField DataField="RecordType" HeaderText="RecordType" 
                            SortExpression="RecordType" />
                        <asp:BoundField DataField="ProgramInformation" HeaderText="ProgramInformation" 
                            SortExpression="ProgramInformation" />
                    </Columns>
                </asp:GridView>
                </ContentTemplate>

default.aspx.vb

Imports System.Web.Services
Partial Class processes_ProgramTrack_Default
Public Property SortOrder() As String
        Get
            If (ViewState("SortOrder").ToString = "desc") Then
                ViewState("SortOrder") = "asc;"
            Else
                ViewState("SortOrder") = "desc"
            End If
            Return ViewState("SortOrder").ToString()
        End Get
        Set(ByVal value As String)
            ViewState("SortOrder") = value
        End Set
    End Property
    Public Sub bindGridView(Optional ByVal sortExp As String = "", Optional ByVal sortDir As String = "")
        Dim connstr As String = ConfigurationManager.ConnectionStrings("WEBConnectionString").ConnectionString
        Dim conn As New SqlConnection(connstr)
        If conn.State = ConnectionState.Closed Then
            conn.Open()
        End If
        Dim myDataView As New DataView()
        Dim mysqlCommand As New SqlCommand("SELECT tblPrgTrackPrograms.ProgramNumber, tblPrgTrackPrograms.ProgramName, tblPrgTrackPrograms.ProgramStatus, tblPrgTrackProgramDocumentation.RecordType, tblPrgTrackProgramDocumentation.ProgramInformation FROM tblPrgTrackPrograms INNER JOIN tblPrgTrackProgramDocumentation ON tblPrgTrackPrograms.ProgramNumber = tblPrgTrackProgramDocumentation.ProgramNumber")
        Dim myDataSet As New DataSet()
        Dim mySQLAdapter As New SqlDataAdapter(mysqlCommand)
        mySQLAdapter.SelectCommand.Connection = conn

        mySQLAdapter.Fill(myDataSet)
        myDataView = myDataSet.Tables(0).DefaultView
        If sortExp <> String.Empty Then

            myDataView.Sort = String.Format("{0}{1}", sortExp, sortDir)
        End If
        gvProgramDetails.DataSource = myDataView
        gvProgramDetails.DataBind()
    End Sub

    Protected Sub gvProgramDetails_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles gvProgramDetails.Load
        bindGridView()
    End Sub
    Protected Sub gvProgramDetails_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gvProgramDetails.PageIndexChanging
        gvProgramDetails.PageIndex = e.NewPageIndex
        bindGridView()
    End Sub

    Protected Sub gvProgramDetails_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles gvProgramDetails.RowDeleting

    End Sub

    Protected Sub gvProgramDetails_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvProgramDetails.Sorting
        SortOrder = ViewState("SortOrder").ToString
        bindGridView(e.SortExpression, SortOrder)
    End Sub

End Class

我将错误消息作为弹出式消息传递来获取。我认为正在发生的事情,SortOrder没有被分配一个值。

1 个答案:

答案 0 :(得分:0)

在尝试调用ToString之前,您需要确保ViewState("SortOrder")中有值。否则,它将抛出该异常(正如您所见),因为您无法在null上调用ToString方法。

基本上,您需要在“If (ViewState("SortOrder") IsNot Nothing Then”块中包含对该ViewState变量的引用,并可能在“Else”部分提供特殊处理(如果需要)。

您的财产有类似的内容:

Public Property SortOrder() As String
    Get
        If (ViewState("SortOrder") IsNot Nothing Then
            If (ViewState("SortOrder").ToString = "desc") Then
                ViewState("SortOrder") = "asc;"
            Else
                ViewState("SortOrder") = "desc"
            End If
        End If
        Return ViewState("SortOrder").ToString()
    End Get
    Set(ByVal value As String)
        ViewState("SortOrder") = value
    End Set
End Property

然后你的排序事件也是如此:

Protected Sub gvProgramDetails_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvProgramDetails.Sorting
    If (ViewState("SortOrder") IsNot Nothing Then
        SortOrder = ViewState("SortOrder").ToString
        bindGridView(e.SortExpression, SortOrder)
    End If
End Sub

注意:鉴于您目前提供的信息,这是我对您的问题的最佳猜测。如果您提供了抛出错误的行,我很乐意再看看。