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

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

主要代码:

下面代码显示了GridView的使用

  1. <asp:GridView ID="GridView1" runat="server"
  2. AutoGenerateColumns="False" AllowPaging="True"
  3. PageSize="5" Width="324px" DataKeyNames="CategoryID"
  4. OnPageIndexChanging="GridView1_PageIndexChanging">
  5. <Columns>
  6. <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" />
  7. <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" />
  8. <asp:TemplateField HeaderText="Select">
  9. <ItemTemplate>
  10. <asp:CheckBox ID="CheckBox1" runat="server" />
  11. </ItemTemplate>
  12. </asp:TemplateField>
  13. </Columns>
  14. </asp:GridView>

请注意这里AllowPaging设置为true,表示启用了分页,而且分页大小为5。DataKeyNames设置为CategoryID,因为他是数据库使用的主键。
使用后台代码,首先定义一个常量

  1. /* QUERY */
  2. private const string QUERY_SELECT_ALL_CATEGORIES = "SELECT * FROM Categories";

这个常量在BindData里使用用来获取数据源

  1. private void BindData()
  2. {
  3. SqlConnection myConnection = new SqlConnection(ConnectionString);
  4. SqlDataAdapter ad = new SqlDataAdapter(QUERY_SELECT_ALL_CATEGORIES,
  5. myConnection);
  6. DataSet ds = new DataSet();
  7. ad.Fill(ds, "Categories");
  8. GridView1.DataSource = ds;
  9. GridView1.DataBind();
  10. }

保存CheckBox的值
GridView在分页过程中并不维护CheckBox的选择状态,幸运的是,我们可以使用Session来维护CheckBox的状态,这个功能使用RememberOldValues完成

  1. private void RememberOldValues()
  2. {
  3. ArrayList categoryIDList = new ArrayList();
  4. int index = -1;
  5. foreach (GridViewRow row in GridView1.Rows)
  6. {
  7.   index = (int) GridView1.DataKeys[row.RowIndex].Value;
  8.   bool result = ((CheckBox)row.FindControl("CheckBox1")).Checked;
  9. // Check in the Session
  10. if (Session[CHECKED_ITEMS] != null)
  11.   categoryIDList = (ArrayList)Session[CHECKED_ITEMS];
  12. if (result)
  13. {
  14. if (!categoryIDList.Contains(index))
  15.   categoryIDList.Add(index);
  16. }
  17. else
  18.   categoryIDList.Remove(index);
  19. }
  20. if (categoryIDList != null && categoryIDList.Count > 0)
  21.   Session[CHECKED_ITEMS] = categoryIDList;
  22. }

还原CheckBox的状态

下一步,需要定义一个方法来还原Checkbox的状态值

  1. private void RePopulateValues()
  2. {
  3. ArrayList categoryIDList = (ArrayList)Session[CHECKED_ITEMS];
  4. if (categoryIDList != null && categoryIDList.Count > 0)
  5. {
  6. foreach (GridViewRow row in GridView1.Rows)
  7. {
  8.   int index = (int)GridView1.DataKeys[row.RowIndex].Value;
  9. if (categoryIDList.Contains(index))
  10. {
  11.   CheckBox myCheckBox = (CheckBox) row.FindControl("CheckBox1");
  12.   myCheckBox.Checked = true;
  13. }
  14. }
  15. }
  16. }

最后,在分页事件里调用上面两个方法

  1. protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
  2. {
  3. RememberOldValues();
  4. GridView1.PageIndex = e.NewPageIndex;
  5. BindData();
  6. RePopulateValues();
  7. }

注意的问题:
1.在GridView中必须设置 DataKeyNames = "数据表的主键"
2.设置CheckBox ID="checkbox1" 的属性(根据后台需要进行更改)
3.Session[CHECKED_ITEMS] 为页面的checkbox列,要加双引号 Session["CHECKED_ITEMS"]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值