[.NET]Gridview的全選CheckBox

很多人會問,這不是已經老掉牙的問題了嗎,為什麼還要再提出來呢
網路上已經有數不清的文章與程式了
重點就在這裡...
網路上的程式不是半殘就是有問題,所以我才會決定再發一篇
把我自己處理的方式分享給大家看一下

嗯...
很多人會問,這不是已經老掉牙的問題了嗎,為什麼還要再提出來呢
網路上已經有數不清的文章與程式了

重點就在這裡...
網路上的程式不是半殘就是有問題,所以我才會決定再發一篇
把我自己處理的方式分享給大家看一下

首先我們先來看之前的文章有什麼問題好了


如何在 GridView 中加上 CheckBox 的全選功能

http://www.allenkuo.com/EBook5/view.aspx?TreeNodeID=10&id=127

這篇文章是Allen在2008年寫的,他的程式有什麼問題呢?
問題就在,Javascript的寫法上,若是採用他的寫法,那這樣頁面上就不能放超過兩個以上的Gridview
不然點選了一個全選的CheckBox,頁面上所有的CheckBox都會全選了...

 

[JavaScript&jQuery] 讓GridView可以使用全選/取消的CheckBox功能

http://www.dotblogs.com.tw/joysdw12/archive/2011/03/08/21731.aspx

這篇文章中的作法確實可行,但是還有一個問題,就是若是一個Gridview中有兩個以上的CheckBox的欄位
那Javascript就必須寫兩個function,或是將cells[0]的部份用參數代入,才能符合多了CheckBox欄位的需求

 

而我呢?
我為了方便,將CheckBox作成了一個UserControl,只要放在Gridview的HeaderTemplate上,不論多少欄位或是多少個Gridview都可以適用
以下就為大家說明一下這個UserControl的作法

1.於專案中先建立一個ucGridViewChoiceAll.ascx,並在這個UserControl中放置一個CheckBox與HiddenField

2.在ucGridViewChoiceAll.ascx.cs中加入屬性以及Page_PreRender的事件
 

    /// 
    /// 核取方塊的名稱
    /// 
    public string CheckBoxName { get; set; }
    /// 
    /// 設定Header字串
    /// 
    public string HeaderText { set { cbxChoice.Text = value; } }

而Page_PreRender的事件內容如下

這樣子,我們就準備好UserControl的內容了
接下來,我們要實際應用在aspx頁面上的Gridview控制項中

3.於Gridview控制項中,加入CheckBox欄位與UserControl
讓我們在Gridview中,建立一個TemplateField,並在TemplateField中
加入HeaderTemplate與ItemTemplate,而剛剛作好的UserControl放置於HeaderTemplate,ItemTemplate則放置一個ChekBox,ID為cbxChoice
然後我們在UserControl上面設定兩個屬性,CheckBoxName設定為cbxChoice,也就是在ItemTemplate中放置的CheckBox的ID
另一個屬性為HeaderText,就是代表希望在欄位首顯示的文字

    <asp:GridView runat="server" ID="gvData" AllowPaging="True" AutoGenerateColumns="False">
        <Columns>
            <asp:TemplateField>
                <HeaderTemplate>
                    <uc1:ucGridViewChoiceAll ID="ucGridViewChoiceAll1" runat="server" CheckBoxName="cbxChoice" HeaderText="全選1" />
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:CheckBox runat="server" ID="cbxChoice" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="Param_Name" HeaderText="Param_Name" />
	    <asp:BoundField DataField="Param_Value" HeaderText="Param_Value" />
	    <asp:BoundField DataField="Param_Note" HeaderText="Param_Note" />
	</Columns>
 </asp:GridView>

大功告成,接下來只要實際去執行就可以了

 

即使是兩個以上的CheckBox也不怕,只要在UserControl中的CheckBoxName有對應好的話,就算來100個CheckBox的欄位也不怕

最後,當然依照慣例提供程式碼讓大家下載參考使用
WebSite1.zip

有個地方必須注意的,就是在我所提供的程式中
不同欄位的CheckBox欄,其HeaderTemplate中的UserControl的ID必須不同,不然會去選到別人家的CheckBox喔
當然各位高手也可以自行修改以符合自己使用