利用ASP.NET的HiddenField記錄GridView的CheckBox狀態,並且加入全選、取消全選、分頁保留CheckBox狀態,達到類似Gmail的郵件清單功能

利用ASP.NET的HiddenField記錄GridView的CheckBox狀態,並且加入全選、取消全選、分頁保留CheckBox狀態,達到類似Gmail的郵件清單功能

最近在小舖看到很多在討論GridView的CheckBox何如做全選或取消全選的動作,甚至分頁保留CheckBox狀態的功能

以上功能如果全都有了,就很類似Gmail的郵件清單功能了..所以小弟寫了一個很笨的方法來達到此功能....

p.s.如有Bug請多多指教

首先準備一個資料庫,欄位如下
id(int自動編號),name(nvarchar(50)),tel(nvarchar(50))
1,puma,1234567
2,hent,2345678
,,,,,,,

c#範例

GridViewPage_CS.aspx

01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridViewPage_CS.aspx.cs"
02     Inherits="GridViewPage_CS" %>
03
04 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
05 <html xmlns="http://www.w3.org/1999/xhtml">
06 <head id="Head1" runat="server">
07     <title>未命名頁面</title>
08 </head>
09 <body>
10     <form id="form1" runat="server">
11         <div>
12             <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
13                 DataKeyNames="id" DataSourceID="SqlDataSource1" OnRowDataBound="GridView1_RowDataBound"
14                 PageSize="5">
15                 <Columns>
16                     <asp:TemplateField>
17                         <ItemTemplate>
18                             <asp:CheckBox ID="ckbID" runat="server" AutoPostBack="True" OnCheckedChanged="ckbID_CheckedChanged" />
19                             <asp:HiddenField ID="HidID" runat="server" Value='<%# Eval("id") %>' />
20                         </ItemTemplate>
21                         <HeaderTemplate>
22                             <asp:LinkButton ID="linkbtnAll" runat="server" OnClick="linkbtnAll_Click">全選</asp:LinkButton>
23                             <asp:LinkButton ID="linkbtnNo" runat="server" OnClick="linkbtnNo_Click"></asp:LinkButton>
24                         </HeaderTemplate>
25                     </asp:TemplateField>
26                     <asp:TemplateField HeaderText="name" SortExpression="name">
27                         <ItemTemplate>
28                             <asp:Label ID="lblName" runat="server" Text='<%# Bind("name") %>'></asp:Label>
29                         </ItemTemplate>
30                     </asp:TemplateField>
31                     <asp:TemplateField HeaderText="tel" SortExpression="tel">
32                         <ItemTemplate>
33                             <asp:Label ID="lblTel" runat="server" Text='<%# Bind("tel") %>'></asp:Label>
34                         </ItemTemplate>
35                     </asp:TemplateField>
36                 </Columns>
37             </asp:GridView>
38             <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
39                 SelectCommand="SELECT * FROM [user]"></asp:SqlDataSource>
40             <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="查看選取項目" />
41             <asp:HiddenField ID="hidAll" runat="server" />
42         </div>
43     </form>
44 </body>
45 </html>
46


GridViewPage_CS.aspx.cs

001 using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;
002
003 public partial class GridViewPage_CS : System.Web.UI.Page
004 {
005 protected void Page_Load(object sender, EventArgs e)
006 {
007
008 }

009
010 //checkbox改變
011 protected void ckbID_CheckedChanged(object sender, EventArgs e)
012 {
013 CheckBox ckb = sender as CheckBox;
014
015 if (ckb.Checked == true)
016 {
017 this.hidAll.Value += ((HiddenField)ckb.Parent.FindControl("HidID")).Value + ",";
018 }

019 else
020 {
021 string[] param = this.hidAll.Value.Split(new char[] { ',' } , StringSplitOptions.RemoveEmptyEntries);
022
023 this.hidAll.Value = "";
024
025 foreach (string item in param)
026 {
027 if (item != ((HiddenField)ckb.Parent.FindControl("HidID")).Value)
028 {
029 this.hidAll.Value += item + ",";
030 }

031 }

032 }

033 }

034
035 //查看選取項目
036 protected void Button1_Click(object sender, EventArgs e)
037 {
038 Response.Write(this.hidAll.Value);
039 }

040
041 //checkbox綁定
042 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
043 {
044 if (e.Row.RowType== DataControlRowType.DataRow)
045 {
046 string[] param = this.hidAll.Value.Split(new char[] { ','} , StringSplitOptions.RemoveEmptyEntries);
047
048 foreach (string item in param)
049 {
050 if (item == ((HiddenField)e.Row.Cells[0].FindControl("HidID")).Value)
051 {
052 ((CheckBox)e.Row.Cells[0].FindControl("ckbID")).Checked = true;
053 break;
054 }

055 }

056 }

057 }

058
059 //checkbox全選
060 protected void linkbtnAll_Click(object sender, EventArgs e)
061 {
062 string[] param = this.hidAll.Value.Split(new char[] { ',' } , StringSplitOptions.RemoveEmptyEntries);
063
064 int cnt;
065
066 foreach (GridViewRow item in this.GridView1.Rows)
067 {
068 cnt = 0;
069 foreach (string str in param)
070 {
071 if (((HiddenField)item.Cells[0].FindControl("HidID")).Value == str)
072 {
073 cnt++;
074 }

075 }

076
077 if (cnt == 0)
078 {
079 this.hidAll.Value += ((HiddenField)item.Cells[0].FindControl("HidID")).Value+",";
080 }

081 }

082
083 this.DataBind();
084 }

085
086 //checkbox取消全選
087 protected void linkbtnNo_Click(object sender, EventArgs e)
088 {
089 string[] param = this.hidAll.Value.Split(new char[] { ',' } , StringSplitOptions.RemoveEmptyEntries);
090
091 int cnt;
092
093 foreach (GridViewRow item in this.GridView1.Rows)
094 {
095 for (int i = 0; i < param.Length; i++)
096 {
097 if (((HiddenField)item.Cells[0].FindControl("HidID")).Value == param[i])
098 {
099 param[i] = "";
100 }

101 }

102 }

103
104 this.hidAll.Value = "";
105
106 for (int i = 0; i < param.Length; i++)
107 {
108 if (param[i] != "")
109 {
110 this.hidAll.Value += param[i] + ",";
111 }

112 }

113
114 this.DataBind();
115 }

116 }

117