在分页Gridview时保持复选框状态

时间:2017-04-21 22:49:07

标签: asp.net gridview checkbox rendering

简而言之,我正在尝试在分页时在 GridView 上维护 CheckBox 状态。我成功跟踪 ViewState 中的 CheckBox 状态(在行ID上使用 ArrayList ),我可以成功地对所有检查多个页面上的行。

但是,一旦我转到新页面然后回页,就不再检查已检查的CheckBox(尽管行ID仍存在于ViewState的ArrayList中)。我必须假设这与页面生命周期有关。

我已经阅读了整个 ASP.NET页面生命周期概述,并尝试在PreRender事件中绑定GridView(并且根本没有绑定GridView),这也没有用。我在网上找到的所有例子都是使用从SQLDataAdapter填充的DataTable从代码后面加载GridView DataSource。我正在使用直接分配给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>

ASPX.VB Page

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

1 个答案:

答案 0 :(得分:0)

经过几个小时的研究,我终于能够通过将 SetCheckboxState()移出 grdAdminIntakes_PageIndexChanging 事件并进入 grdAdminIntakes_DataBound来实现这一目标。 事件。