Asp.net 分页Gridview时保持复选框状态

Asp.net 分页Gridview时保持复选框状态,asp.net,gridview,checkbox,rendering,Asp.net,Gridview,Checkbox,Rendering,简而言之,我试图在分页时维护GridView上的复选框状态。我正在成功地跟踪ViewState中的复选框状态(使用行ID上的ArrayList),并且我可以成功地对多个页面上的所有选中行执行操作 但是,一旦我转到一个新页面,然后返回页面,选中的复选框将不再被选中(尽管行ID仍然存在于ViewState的ArrayList中)。我必须假设这与页面生命周期有关 我已经阅读了整个ASP.NET页面生命周期概述,并尝试在PreRender事件中绑定GridView(而根本不绑定GridView),但也没

简而言之,我试图在分页时维护GridView上的复选框状态。我正在成功地跟踪ViewState中的复选框状态(使用行ID上的ArrayList),并且我可以成功地对多个页面上的所有选中行执行操作

但是,一旦我转到一个新页面,然后返回页面,选中的复选框将不再被选中(尽管行ID仍然存在于ViewState的ArrayList中)。我必须假设这与页面生命周期有关

我已经阅读了整个ASP.NET页面生命周期概述,并尝试在PreRender事件中绑定GridView(而根本不绑定GridView),但也没有成功。我在网上找到的所有示例都是使用SQLDataAdapter填充的数据表从代码隐藏加载GridView数据源。我使用的是直接分配给GridView的DataSourceID(来自SQLDataSource)

我仍然无法确定为什么这会失败。提前感谢您抽出时间

ASPX页

<asp:SqlDataSource ID="sdsAdminIntakes" runat="server" CancelSelectOnNullParameter="false"
    Connectionstring="<%$ ConnectionStrings:MyAppSiteDB %>"
    ProviderName="<%$ ConnectionStrings:MyAppSiteDB.ProviderName %>"
    SelectCommand="admin_intakes_search"
    SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter Name="specialist_id" />
        <asp:Parameter Name="caller_name" />
        <asp:Parameter Name="case_number" />
        <asp:Parameter Name="case_status" />
    </SelectParameters>
</asp:SqlDataSource>

<asp:GridView ID="grdAdminIntakes" runat="server"
    DataKeyNames="intake_id" DataSourceID="sdsAdminIntakes"
    AutoGenerateColumns="False" AllowSorting="True"
    AllowPaging="True" PageSize="20">
    <Columns>
        <asp:TemplateField>
            <HeaderTemplate>
                <asp:CheckBox runat="server" ID="chkAll" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chkIntake" />
            </ItemTemplate>
        </asp:TemplateField>

        <asp:BoundField DataField="specialist_full_name" HeaderText="Current Specialist"
            SortExpression="specialist_full_name" >
        </asp:BoundField>
        <asp:BoundField DataField="caller_name" HeaderText="Caller"
            SortExpression="caller_name" >
        </asp:BoundField>
        <asp:BoundField DataField="case_number" HeaderText="Case #"
            SortExpression="case_number" >
        </asp:BoundField>
        <asp:BoundField DataField="cmp_status" HeaderText="Case Status"
            SortExpression="case_status" ItemStyle-CssClass="case_status" >
        </asp:BoundField>
    </Columns>
</asp:GridView>

经过几个小时的研究,我终于能够通过将SetCheckboxState()从GrDadmInTakes_PageIndexchange事件移动到GrDadmInTakes_DataBound事件中来实现这一点。

检查我跟踪了您的链接并阅读了整篇文章,但我在分页时保存数据没有问题,我在呈现复选框时遇到问题。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        grdAdminIntakes.DataBind()
    End If
End Sub

Private Sub grdAdminIntakes_PageIndexChanging(sender As Object, e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles grdAdminIntakes.PageIndexChanging
    GetCheckboxState()
    grdAdminIntakes.PageIndex = e.NewPageIndex
    grdAdminIntakes.DataBind()
    SetCheckboxState()
End Sub

Private Sub GetCheckboxState()
    Dim lstArray As ArrayList
    If ViewState("SelectedRecords") IsNot Nothing Then
        lstArray = DirectCast(ViewState("SelectedRecords"), ArrayList)
    Else
        lstArray = New ArrayList()
    End If
    Dim chkAll As CheckBox = DirectCast(grdAdminIntakes.HeaderRow.Cells(0).FindControl("chkAll"), CheckBox)
    For i As Integer = 0 To grdAdminIntakes.Rows.Count - 1
        If chkAll.Checked Then
            If Not lstArray.Contains(grdAdminIntakes.DataKeys(i).Value) Then
                lstArray.Add(grdAdminIntakes.DataKeys(i).Value)
            End If
        Else
            Dim chk As CheckBox = DirectCast(grdAdminIntakes.Rows(i).Cells(0).FindControl("chkIntake"), CheckBox)
            If chk.Checked Then
                If Not lstArray.Contains(grdAdminIntakes.DataKeys(i).Value) Then
                    lstArray.Add(grdAdminIntakes.DataKeys(i).Value)
                End If
            Else
                If lstArray.Contains(grdAdminIntakes.DataKeys(i).Value) Then
                    lstArray.Remove(grdAdminIntakes.DataKeys(i).Value)
                End If
            End If
        End If
    Next
    ViewState("SelectedRecords") = lstArray
End Sub

Private Sub SetCheckboxState()
    Dim currentCount As Integer = 0
    Dim chkAll As CheckBox = DirectCast(grdAdminIntakes.HeaderRow.Cells(0).FindControl("chkAll"), CheckBox)
    chkAll.Checked = True
    Dim lstArray As ArrayList = DirectCast(ViewState("SelectedRecords"), ArrayList)
    For i As Integer = 0 To grdAdminIntakes.Rows.Count - 1
        Dim chk As CheckBox = DirectCast(grdAdminIntakes.Rows(i).Cells(0).FindControl("chkIntake"), CheckBox)
        If chk IsNot Nothing Then
            chk.Checked = lstArray.Contains(grdAdminIntakes.DataKeys(i).Value)
            If Not chk.Checked Then
                chkAll.Checked = False
            Else
                currentCount += 1
            End If
        End If
    Next
End Sub