【问题标题】:Persisting Checkbox State when Paging Gridview分页 Gridview 时保持复选框状态
【发布时间】:2017-04-21 22:49:07
【问题描述】:

简而言之,我试图在分页时保持 GridView 上的 CheckBox 状态。我成功地跟踪 ViewState 中的 CheckBox 状态(在行 ID 上使用 ArrayList)并且我可以成功地对所有检查多页上的行。

但是,一旦我转到一个新页面然后返回页面,已选中的 CheckBoxes 将不再被选中(尽管行 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 页面

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

【问题讨论】:

  • 检查here
  • 我点击了您的链接并阅读了整篇文章,但在分页时保存数据没有问题,我在渲染选中的复选框时遇到了问题。

标签: asp.net gridview checkbox rendering


【解决方案1】:

经过几个小时的研究,我终于能够通过将 SetCheckboxState()grdAdminIntakes_PageIndexChanging 事件移到 grdAdminIntakes_DataBound 中来完成这项工作 事件。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多