关于GridView翻页checkBox状态保存的问题 (session)

主要功能:
1.实现GridView的分页功能.
2.实现GridView分页时候记录下checkBox的状态

 主要代码:

下面代码显示了 GridView 的使用
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False" AllowPaging="True" 
PageSize="5" Width="324px" DataKeyNames="CategoryID"
OnPageIndexChanging="GridView1_PageIndexChanging">
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="CategoryID" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName" />
<asp:TemplateField HeaderText="Select">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
 
请注意这里 AllowPaging 设置为 true ,表示启用了分页,而且分页大小为 5 DataKeyNames 设置为 CategoryID ,因为他是数据库使用的主键。

使用后台代码,首先定义一个常量

 
/* QUERY */
private const string QUERY_SELECT_ALL_CATEGORIES = "SELECT * FROM Categories";
这个常量在 BindData 里使用用来获取数据源
private void BindData()
{
 SqlConnection myConnection = new SqlConnection(ConnectionString);
 SqlDataAdapter ad = new SqlDataAdapter(QUERY_SELECT_ALL_CATEGORIES,
 myConnection);
 DataSet ds = new DataSet();
 ad.Fill(ds, "Categories");
 GridView1.DataSource = ds;
 GridView1.DataBind();
}
 
 
保存 CheckBox 的值
 GridView 在分页过程中并不维护 CheckBox 的选择状态,幸运的是,我们可以使用 Session 来维护 CheckBox 的状态, 这个功能使用 RememberOldValues 完成
private void RememberOldValues()
{
 ArrayList categoryIDList = new ArrayList();
 int index = -1;
 foreach (GridViewRow row in GridView1.Rows)
 {
   index = (int) GridView1.DataKeys[row.RowIndex].Value;
   bool result = ((CheckBox)row.FindControl("CheckBox1")).Checked;
 
 // Check in the Session
 if (Session[CHECKED_ITEMS] != null)
   categoryIDList = (ArrayList)Session[CHECKED_ITEMS];
 if (result)
 {
 if (!categoryIDList.Contains(index))
   categoryIDList.Add(index);
 }
 else
   categoryIDList.Remove(index);
 }
 if (categoryIDList != null && categoryIDList.Count > 0)
   Session[CHECKED_ITEMS] = categoryIDList;
}
 
还原 CheckBox 的状态
   下一步,需要定义一个方法来还原 Checkbox 的状态值
 
private void RePopulateValues()
{
 ArrayList categoryIDList = (ArrayList)Session[CHECKED_ITEMS];
 if (categoryIDList != null && categoryIDList.Count > 0)
 {
 foreach (GridViewRow row in GridView1.Rows)
 {
   int index = (int)GridView1.DataKeys[row.RowIndex].Value;
 if (categoryIDList.Contains(index))
 {
   CheckBox myCheckBox = (CheckBox) row.FindControl("CheckBox1");
   myCheckBox.Checked = true;
 }
 }
 }
}
 
最后,在分页事件里调用上面两个方法
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
 RememberOldValues();
 GridView1.PageIndex = e.NewPageIndex;
 BindData();
 RePopulateValues();
}
源代码可以在我的资源里下载
注意的问题:
1.在GridView中必须设置 DataKeyNames = "数据表的主键"
2.设置CheckBox ID="checkbox1" 的属性(根据后台需要进行更改)
3.Session[CHECKED_ITEMS] 为页面的checkbox列,要加双引号 Session["CHECKED_ITEMS"]


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1814102

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值