所以我创建了一个GridView,我应该保留已经工作的另一个模块的值,但每次我更改页面时,所选的值都已被遗忘。我构建了一些代码,因为我是ASP的新手,我不知道,我不知道我做错了什么。任何帮助将不胜感激。
protected void gvApplicants_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvApplicants.PageIndex = e.NewPageIndex;
LoadData();
Response.Write(gvApplicants.PageIndex.ToString());
int d = gvApplicants.PageCount;
bool[] values = new bool[gvApplicants.PageSize];
CheckBox chb;
int count = 0;
for (int i = 0; i < gvApplicants.Rows.Count; i++)
{
chb = (CheckBox)gvApplicants.Rows[i].FindControl("selectedMail");
if (chb != null)
{
values[i] = chb.Checked;
}
}
Session["page" + gvApplicants.PageIndex] = values;
}
protected void gvApplicants_PreRender(object sender, EventArgs e)
{
if (Session["page" + gvApplicants.PageIndex] != null)
{
CheckBox chb;
bool[] values = (bool[])Session["page" + gvApplicants.PageIndex];
for (int i = 0; i < gvApplicants.Rows.Count; i++)
{
chb = (CheckBox)gvApplicants.Rows[i].FindControl("selectedMail");
chb.Checked = values[i];
}
}
}
每次索引丢失,我似乎无法保留原始索引。
谢谢!
答案 0 :(得分:0)
如果您使用的是GridView附带的内置分页,那么您始终可以使用页面索引。一般来说,从不在PageIndexChanging
事件中设置PageIndex。 e.NewPageIndex
是gvApplicants.PageIndex 将 在该事件完成后的内容,它可供参考。
我可以推断以下内容吗?
LoadData()
的调用。 PageIndexChanging
事件中处理保存状态时,每个复选框都禁用了AutoPostBack。为了在页面更改之间保持已检查状态,您需要创建一个在viewstate中保存的唯一ID,以正确识别关联的复选框
所以在PageIndexChanging
:
protected void gvApplicants_PageIndexChanging( object sender, GridViewPageEventArgs e )
{
GridView gv = (GridView) sender;
foreach( GridViewRow gvr in gv.Rows){
CheckBox cb = (CheckBox) gvr.FindControl( "selectedMail" );
String cbid = String.Format( "cb{0}", gv.PageIndex * gv.PageSize + gvr.RowIndex );
ViewState[ cbid ] = cb.Checked;
}
}
要恢复:
protected void gvApplicants_RowDataBound( object sender, GridViewRowEventArgs e )
{
if ( e.Row.RowType == DataControlRowType.DataRow )
{
GridView gv = (GridView)sender;
CheckBox cb = (CheckBox) e.Row.FindControl( "selectedMail" );
String cbid = String.Format( "cb{0}", gv.PageIndex * gv.PageSize + e.Row.RowIndex );
cb.Attributes["data-unique-id"] = cbid;
cb.Checked = ViewState[ cbid ];
}
}
请记住,这非常简单和混乱,更不用说管理行删除了。但这比用短期状态数据加密会话要好。
考虑使用从索引属性访问的可持久集合来合并状态数据。 SO上有很多例子。