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();
}