关于CheckBox 在DataList中分页全选有关问题

关于CheckBox 在DataList中分页全选问题

翻页后 前一页 选中了CheckBox 就失效了

如何实现翻页全选

------解决方案--------------------
Gridview的例子,DataList也可以类似


GET 方式实现 GridView 跨页面多选

使用 POST 方式,使用控件很容易解决这个问题,但是 GET 方式,存储数据的方式有限,可以采取 Cookie 存储选择的数据,也可以使用 Ajax 到服务器端进行保存。对于超过Cookie限制的地方,采用 Ajax 是很好的方法。下面就是采取 Cookie 保存数据的例子。


ASPX 代码
HTML code

<%@ Page Language="C#" Debug="false" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  String Articles = String.Empty;
  protected void Page_Load(object sender, EventArgs e)
  {
    if (Request.Cookies["ArticleId"]!=null)  Articles = Request.Cookies["ArticleId"].Value;
    Articles = Server.UrlDecode(Articles);  
    
    string xlsConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|MengxianHui.mdb";
    OleDbConnection cn = new OleDbConnection(xlsConnStr);
    cn.Open();
    String sql = "SELECT Count(*) FROM [Document]";
    OleDbCommand cmd = new OleDbCommand(sql, cn);

    // 总的记录数
    int TotalCount = Convert.ToInt32(cmd.ExecuteScalar());

    //当前页的序号
    int PageIndex = 1;
    String page = Request.QueryString["Page"];
    if (page == null) page = "1";
    if (!Int32.TryParse(page, out PageIndex)) PageIndex = 1;
    if (PageIndex < 1) PageIndex = 1;

    //每页显示的数量
    int PageItem = 5;
    int startRecord = (PageIndex - 1) * PageItem;

    sql = "SELECT [ArticleId],[Title],[CreateDate],[Author] FROM [Document] Order By [ArticleId] DESC";
    OleDbDataAdapter da = new OleDbDataAdapter(sql, cn);
    DataSet ds = new DataSet();
    da.Fill(ds, startRecord, PageItem, "Document");

    GridView1.DataSource = ds.Tables[0].DefaultView;
    GridView1.DataBind();

    BuildPagers(TotalCount, PageIndex, PageItem);
    cn.Dispose();
  }

  private void BuildPagers(int TotalCountRecord, int CurrentPage, int PageItem)
  {
    int Step = 6;
    int LeftNum = 0;
    int RightNum = 0;
    String PageUrl = "?";
    int PageCount = (int)Math.Ceiling((double)(TotalCountRecord) / PageItem);
    if (CurrentPage - Step < 1)
    {
      LeftNum = 1;
    }
    else
    {
      LeftNum = CurrentPage - Step;
    }

    if (CurrentPage + Step > PageCount)
    {
      RightNum = PageCount;
    }
    else
    {
      RightNum = CurrentPage + Step;
    }
    string OutPut = "";
    for (int i = LeftNum; i <= RightNum; i++)
    {
      if (i == CurrentPage)
      {
        OutPut += "<span style='color:red'>" + i.ToString() + "</span> ";
      }
      else
      {
        OutPut += "<a href=\"" + PageUrl + "Page=" + i.ToString() + "\">" + i.ToString() + "</a> ";
      }
    }
    if (CurrentPage > 1)
    {
      OutPut = "<a href='" + PageUrl + "Page=1'>首页</a>  <a href=\"" + PageUrl + "Page=" + (CurrentPage - 1) + "\">上一页</a> " + OutPut;
    }

    if (CurrentPage < PageCount)
    {
      OutPut += " <a href=\"" + PageUrl + "Page=" + (CurrentPage + 1) + "\">下一页</a> <a href='" + PageUrl + "Page=" + PageCount + "'>末页</a>";
    }
    Pager.InnerHtml = OutPut;
  }

  protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
  {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
      String CurrentArticleId = DataBinder.Eval(e.Row.DataItem, "ArticleId").ToString();
      CheckBox ArticleId = e.Row.FindControl("ArticleId") as CheckBox;
      ArticleId.Attributes.Add("onclick", "SetArticleId(this," + CurrentArticleId + ")");
      if (Articles.IndexOf("|" + CurrentArticleId + "|") > -1)
      {
        ArticleId.Checked = true;
      }
    }
  }

  protected void Button1_Click(object sender, EventArgs e)
  {
    String[] ids = Articles.Split('|');
    for (int i = 0; i < ids.Length; i++)
    {
      if (!ids[i].Trim().Equals(String.Empty))
      {
        Response.Write("<li>" + ids[i]);
      }
    }
  }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title>GET 方式实现 GridView 跨页面多选</title>
  <script type="text/javascript">
    function SetArticleId(o, i) {
      if (o.checked) {
        AddCookie(i)
      }
      else {
        RemoveCookie(i)
      }
    }
    function SetCookie(name, value) {
      document.cookie = name + "=" + escape(value);
    }
    function GetCookie(name) {
      if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(name + "=");
        if (c_start != -1) {
          c_start = c_start + name.length + 1;
          c_end = document.cookie.indexOf(";", c_start);
          if (c_end == -1) c_end = document.cookie.length;
          return unescape(document.cookie.substring(c_start, c_end));
        }
      }
      return "";
    }
    function AddCookie(i) {
      d = GetCookie("ArticleId");
      if (d == "") d = "|";
      if (d.indexOf("|" + i + "|") == -1) {
        d += i + "|";
        SetCookie("ArticleId", d);
      }
    }

    function RemoveCookie(i) {
      d = GetCookie("ArticleId");
      var reg = new RegExp("\\|" + i + "\\|");
      if (reg.test(d)) {
        d = d.replace(reg, "|");  
        SetCookie("ArticleId", d);
      }    
    }    
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <asp:GridView ID="GridView1" runat="server"  CellPadding="6"
  ShowHeader="false" OnRowDataBound="GridView1_RowDataBound">
    <Columns>
      <asp:TemplateField>
        <ItemTemplate>
          <asp:CheckBox ID="ArticleId" runat="server" /></ItemTemplate>
      </asp:TemplateField>
    </Columns>
  </asp:GridView>
  <div id="Pager" runat="server"></div>
  
  <asp:Button ID="Button1" runat="server" Text="查看所选择的ID"
    onclick="Button1_Click" />
  </form>
</body>
</html>