C# 在整个GridView中分页和循环时,请记住GridView中的复选框选项

C# 在整个GridView中分页和循环时,请记住GridView中的复选框选项,c#,asp.net,gridview,pagination,C#,Asp.net,Gridview,Pagination,我在启用分页的aspx页面上有一个gridview。此gridview包含数据库中的一些数据字段,以及每行的复选框 现在,我读了这篇文章:为了能够循环浏览gridview所有页面上的所有行,我必须禁用分页,重新绑定gridview,循环浏览所有行,重新启用分页,最后重新绑定gridview 我开始怀疑如果我在循环所有行之前重新绑定数据源,复选框选项是否会被记住,但很快就确定,即使从一页转到下一页,然后再返回复选框选项也会丢失 我需要有一个带有分页的gridview和每行上的复选框,然后点击一个

我在启用分页的
aspx
页面上有一个
gridview
。此
gridview
包含数据库中的一些数据字段,以及每行的
复选框

现在,我读了这篇文章:为了能够循环浏览
gridview
所有页面上的所有行,我必须禁用分页,重新绑定
gridview
,循环浏览所有行,重新启用分页,最后重新绑定gridview

我开始怀疑如果我在循环所有行之前重新绑定
数据源
,复选框选项是否会被记住,但很快就确定,即使从一页转到下一页,然后再返回
复选框
选项也会丢失


我需要有一个带有分页的
gridview
和每行上的
复选框,然后点击一个按钮,遍历整个
gridview
,并根据
复选框执行一些操作。

gridview本机不可能。但有许多方法可以模拟相同的行为。一种方法是像这样处理PageIndexChange事件上的问题

protected void OriginalTable_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    var selectedIDs = (Session["CheckedIDs"] != null) ? 
        Session["CheckedIDs"] as List<int> : new List<int>();

    //we are now at current page. set the checked ids to a list
    foreach (GridViewRow row in OriginalTable.Rows)
    {
        //get the checkbox in the row ( "HasEmail" is the name of the asp:CheckBox )
        var emailCheckBox = row.FindControl("HasEmail") as CheckBox;
        //gets the primary key of the corresponding row
        var rowOrgID = Convert.ToInt32(OriginalTable.DataKeys[row.RowIndex].Value);
        //is row org_id in the selectedIDs list
        var isRowIDPresentInList = selectedIDs.Contains(rowOrgID);
        // add to list
        if (emailCheckBox.Checked && !isRowIDPresentInList)
        {
            selectedIDs.Add(rowOrgID);
        }
        //remove from list
        if (!emailCheckBox.Checked && isRowIDPresentInList)
        {
            selectedIDs.Remove(rowOrgID);
        }
    }
    OriginalTable.PageIndex = e.NewPageIndex;
    BindTable();
    //we are now at the new page after paging
    //get the select ids and make the gridview checkbox checked accordingly
    foreach (GridViewRow row in OriginalTable.Rows)
    {
        var emailCheckBox = row.FindControl("HasEmail") as CheckBox;
        var rowOrgID = Convert.ToInt32(OriginalTable.DataKeys[row.RowIndex].Value);
        if (selectedIDs.Contains(rowOrgID))
        {
            emailCheckBox.Checked = true;
        }
    }
    Session["CheckedIDs"] = (selectedIDs.Count > 0) ? selectedIDs : null;
}

这看起来很有希望。我得努力把它弄下来。谢谢,如果我想一想:复选框为true的行的ID存储在
会话中
?如果复选框未选中,是否删除?这仅在页面更改时发生,因此单击按钮我需要浏览打开的页面并执行相同的添加/删除操作,然后在
会话中循环浏览id?在此之前,如果用户没有访问所有页面,我需要将所有页面的所有项目添加到
会话的列表中。因此,在默认情况下选择全部,并在用户浏览页面时删除并可能重新添加。如果我没有弄错的话?这并不是说数据库中有一个
HasEmail
字段。该复选框仅用于决定:向此地址发送电子邮件或不向此地址发送电子邮件。基本上,它是一个收件人选择器,默认情况下所有的收件人都被选中。最后,我们着手成功地实现这个解决方案。我确实注意到,我必须在
OriginalTable_PageIndexChanging
的末尾将列表显式保存到会话中。例如:
会话[“checkedds”]=选定的电子邮件此外,我必须在某个时刻确定何时清除会话,否则上一次运行的值将保留在会话变量中。
private void BindTable()
{
    DataTable table = GetTableFromDatabase();

    var selectedIDs = table.AsEnumerable()
        .Where(r => r.Field<bool>("HasEmail"))
        .Select(r => r.Field<int>("ORG_ID"))
        .ToList();
    if (selectedIDs != null && selectedIDs.Count > 0)
        Session["CheckedIDs"] = selectedIDs;

    OriginalTable.DataSource = table;
    OriginalTable.DataBind();
}