扩展GridView控件(4) - 联动复选框(复选框的全选和取消全选)

简介:
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]


扩展GridView控件(4) - 联动复选框(复选框的全选和取消全选)


作者: webabcd
InBlock.gif /*正式版的实现 开始*/
介绍
扩展GridView控件:
联动复选框(复选框的全选和取消全选)。选中指定的父复选框,则设置指定的所有子复选框为选中状态;取消选中指定的父复选框,则设置指定的所有子复选框为取消选中状态。如果指定的所有子复选框为均选中状态,则设置指定的父复选框为选中状态;如果指定的所有子复选框至少有一个为取消选中状态,则设置指定的父复选框为取消选中状态

使用方法(设置CascadeCheckboxes集合属性):
ParentCheckboxID - 模板列中 父复选框ID
ChildCheckboxID - 模板列中 子复选框ID
YYControls.Helper.SmartGridView中的静态方法
List<DataKey> GetCheckedDataKey(GridView gv, int columnIndex)
List<DataKey> GetCheckedDataKey(GridView gv, string checkboxId)


关键代码
js
/*联动复选框 开始*/ 
var yy_sgv_ccGridView_pre =  new Array();  // cs中动态向其灌数据(GridView内控件ID的前缀数组) 
var yy_sgv_ccAll_post =  new Array();  // cs中动态向其灌数据(全选复选框ID的后缀数组) 
var yy_sgv_ccItem_post =  new Array();  // cs中动态向其灌数据(项复选框ID的后缀数组) 

function yy_sgv_ccCheck(e)    

/// <summary>单击复选框时</summary> 

         var evt = e || window.event;  // FF || IE 
         var obj = evt.target || evt.srcElement     // FF || IE 

         var ccIndex = -1; 
         for ( var i=0; i<yy_sgv_ccGridView_pre.length; i++) 
        {        
                 if (obj.id.yy_sgv_startsWith(yy_sgv_ccGridView_pre[i])) 
                { 
                        ccIndex = i; 
                         break
                } 
        } 
         
         if (ccIndex != -1) 
        { 
                 if (obj.id.yy_sgv_endsWith(yy_sgv_ccAll_post[i])) 
                { 
                        yy_sgv_ccCheckAll(ccIndex, obj.checked); 
                } 
                 else  if (obj.id.yy_sgv_endsWith(yy_sgv_ccItem_post[i])) 
                { 
                        yy_sgv_ccCheckItem(ccIndex); 
                } 
        } 


function yy_sgv_ccCheckAll(ccIndex, isCheckAll) 

/// <summary>设置全选复选框的状态</summary> 

         var elements =    document.getElementsByTagName( "INPUT"); 
         
         for (i=0; i< elements.length; i++)    
        {                
                 if (elements[i].type == 'checkbox'    
                        && elements[i].id.yy_sgv_startsWith(yy_sgv_ccGridView_pre[ccIndex])    
                        && elements[i].id.yy_sgv_endsWith(yy_sgv_ccItem_post[ccIndex]))    
                { 
                        elements[i].checked = isCheckAll; 
                         
                         if (yy_sgv_crClassName != '') 
                        { 
                                yy_sgv_changeCheckedRowCssClass(elements[i], yy_sgv_crClassName,  false); 
                        } 
                } 
        }         


function yy_sgv_ccCheckItem(ccIndex) 

/// <summary>单击项复选框时</summary> 

         var elements =    document.getElementsByTagName( "INPUT"); 
         
         var checkedNum = 0; 
         var uncheckedNum = 0; 
         
         for (i=0; i< elements.length; i++)    
        {                
                 if (elements[i].type == 'checkbox'    
                        && elements[i].id.yy_sgv_startsWith(yy_sgv_ccGridView_pre[ccIndex])    
                        && elements[i].id.yy_sgv_endsWith(yy_sgv_ccItem_post[ccIndex]))    
                { 
                         if (elements[i].checked) 
                        { 
                                checkedNum++; 
                        } 
                         else 
                        { 
                                uncheckedNum++; 
                        } 
                } 
        } 
         
         if (uncheckedNum == 0) 
        { 
                yy_sgv_ccCheckCheckbox(yy_sgv_ccGridView_pre[ccIndex], yy_sgv_ccAll_post[ccIndex],  true
        } 
         else 
        { 
                yy_sgv_ccCheckCheckbox(yy_sgv_ccGridView_pre[ccIndex], yy_sgv_ccAll_post[ccIndex],  false
        } 


function yy_sgv_ccCheckCheckbox(pre, post, isCheckAll) 

/// <summary>设置项复选框的状态</summary> 

         var elements =    document.getElementsByTagName( "INPUT"); 
         
         for (i=0; i< elements.length; i++)    
        {                
                 if (elements[i].type == 'checkbox' 
                        && elements[i].id.yy_sgv_startsWith(pre)    
                        && elements[i].id.yy_sgv_endsWith(post))    
                { 
                        elements[i].checked = isCheckAll; 
                         break
                } 
        }         


function yy_sgv_ccListener() 

/// <summary>监听所有联动复选框的单击事件</summary> 

         var elements =    document.getElementsByTagName( "INPUT"); 
         
         for (i=0; i< elements.length; i++)    
        {                
                 if (elements[i].type == 'checkbox')    
                { 
                         for (j=0; j<yy_sgv_ccGridView_pre.length; j++) 
                        { 
                                 if (elements[i].id.yy_sgv_startsWith(yy_sgv_ccGridView_pre[j])    
                                        && (elements[i].id.yy_sgv_endsWith(yy_sgv_ccAll_post[j]) || elements[i].id.yy_sgv_endsWith(yy_sgv_ccItem_post[j]))) 
                                { 
                                        yy_sgv_addEvent(elements[i], 'click', yy_sgv_ccCheck);    
                                         break
                                } 
                        } 
                } 
        }         

        
if (document.all) 

        window.attachEvent(' yy_sgv_ccListener) 

else 

        window.addEventListener('load', yy_sgv_ccListener,  false); 

/*联动复选框 结束*/
 
c#
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.Web.UI.WebControls; 
InBlock.gif using System.Web.UI; 
InBlock.gif 
InBlock.gif namespace YYControls.SmartGridViewFunction 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 扩展功能:联动复选框(复选框的全选和取消全选) 
InBlock.gif         /// </summary> 
InBlock.gif         public  class CascadeCheckboxFunction : ExtendFunction 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 public CascadeCheckboxFunction() 
InBlock.gif                        :  base() 
InBlock.gif                { 
InBlock.gif 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="sgv">SmartGridView对象</param> 
InBlock.gif                 public CascadeCheckboxFunction(SmartGridView sgv) 
InBlock.gif                        :  base(sgv) 
InBlock.gif                { 
InBlock.gif 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 扩展功能的实现 
InBlock.gif                 /// </summary> 
InBlock.gif                 protected  override  void Execute() 
InBlock.gif                { 
InBlock.gif                         this._sgv.PreRender +=  new EventHandler(_sgv_PreRender); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// SmartGridView的PreRender事件 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="sender"></param> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 void _sgv_PreRender( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                         // 构造向数组中添加成员的脚本 
InBlock.gif                         string scriptString = ""; 
InBlock.gif                         foreach (CascadeCheckbox cc  in  this._sgv.CascadeCheckboxes) 
InBlock.gif                        { 
InBlock.gif                                scriptString += String.Format( "yy_sgv_ccGridView_pre.push('{0}');", Helper.Common.GetChildControlPrefix( this._sgv)); 
InBlock.gif                                scriptString += String.Format( "yy_sgv_ccAll_post.push('{0}');", cc.ParentCheckboxID); 
InBlock.gif                                scriptString += String.Format( "yy_sgv_ccItem_post.push('{0}');", cc.ChildCheckboxID); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 注册向数组中添加成员的脚本 
InBlock.gif                         if (! this._sgv.Page.ClientScript.IsClientScriptBlockRegistered(String.Format( "yy_sgv_cascadeCheckbox_{0}"this._sgv.ID))) 
InBlock.gif                        { 
InBlock.gif                                 this._sgv.Page.ClientScript.RegisterClientScriptBlock 
InBlock.gif                                ( 
InBlock.gif                                         this._sgv.GetType(), 
InBlock.gif                                        String.Format( "yy_sgv_cascadeCheckbox_{0}"this._sgv.ID), 
InBlock.gif                                        scriptString, 
InBlock.gif                                         true 
InBlock.gif                                ); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
InBlock.gif /*正式版的实现 结束*/
 
InBlock.gif /*测试版的实现 开始*/
 
介绍
平时使用GridView的时候经常要给每行加一个复选框,然后还需要放置一个单独的全选复选框,通过单击它来让这些复选框全选或取消全选,每次实现这样的功能都要写一段javascript,麻烦,所以扩展它。


控件开发
1、新建一个继承自GridView的类。
/// <summary> 
/// 继承自GridView 
/// </summary> 
InBlock.gif[ToolboxData( @"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")] 
InBlock.gif public  class SmartGridView : GridView 
InBlock.gif
InBlock.gif}
 
2、新建一个JavaScriptConstant类,把我们要用到的javascript存在一个常量里
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace YYControls.SmartGridView 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// javascript 
InBlock.gif         /// </summary> 
InBlock.gif         public  class JavaScriptConstant 
InBlock.gif        { 
InBlock.gif                 internal  const  string jsCheckAll =  @"<script type=""text/javascript""> 
InBlock.gif                 //<![CDATA[ 
InBlock.gif 
InBlock.gif                 // 隐藏字段的ID,用于存每组的全选复选框ID 
InBlock.gif                var hdnAllName = '[$AllName$]'; 
InBlock.gif                 // 隐藏字段的ID,用于存每的项复选框ID 
InBlock.gif                var hdnItemName = '[$ItemName$]'; 
InBlock.gif                 // 组分隔符,一个 全选复选框 和其对应的n个 项复选框 为一个组 
InBlock.gif                var groupSeparator = '[$GroupSeparator$]'; 
InBlock.gif                 // 项分隔符,项复选框 每个项之间的分隔符 
InBlock.gif                var itemSeparator = '[$ItemSeparator$]'; 
InBlock.gif 
InBlock.gif                var strAlls = GetObject(hdnAllName).value; 
InBlock.gif                var strItems = GetObject(hdnItemName).value; 
InBlock.gif 
InBlock.gif                 // 全选复选框数组 
InBlock.gif                var aryAlls = strAlls.split(groupSeparator); 
InBlock.gif                 // 项复选框数组,每行有一个组的所有项复选框 
InBlock.gif                var aryItems = strItems.split(groupSeparator); 
InBlock.gif 
InBlock.gif                 // 全选复选框被单击,参数为 该全选复选框这个对象 
InBlock.gif                function ClickCheckAll(objAll) 
InBlock.gif                { 
InBlock.gif                         // 每个全选复选框 
InBlock.gif                         for (var i=0; i<aryAlls.length; i++) 
InBlock.gif                        { 
InBlock.gif                                 // 该全选复选框是所单击的全选复选框 
InBlock.gif                                 if (aryAlls[i] == objAll.id) 
InBlock.gif                                { 
InBlock.gif                                         // 该全选复选框同组下的项复选框数组 
InBlock.gif                                        aryItem = aryItems[i].split(itemSeparator); 
InBlock.gif                                         for (var j=0; j<aryItem.length; j++) 
InBlock.gif                                        { 
InBlock.gif                                                 // 单击的全选复选框是选中状态,并且项复选框不是disabled,则选中 
InBlock.gif                                                 if (objAll. checked && !GetObject(aryItem[j]).parentElement.disabled) 
InBlock.gif                                                { 
InBlock.gif                                                        GetObject(aryItem[j]). checked =  true
InBlock.gif                                                } 
InBlock.gif                                                 // 否则 
InBlock.gif                                                 else 
InBlock.gif                                                { 
InBlock.gif                                                        GetObject(aryItem[j]). checked =  false
InBlock.gif                                                } 
InBlock.gif                                        } 
InBlock.gif                                 
InBlock.gif                                         break
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 // 项复选框被单击 
InBlock.gif                function ClickCheckItem() 
InBlock.gif                { 
InBlock.gif                         // 每组项复选框 
InBlock.gif                         for (var i=0; i<aryItems.length; i++) 
InBlock.gif                        { 
InBlock.gif                                 // 该组的所有项复选框数组 
InBlock.gif                                aryItem = aryItems[i].split(itemSeparator); 
InBlock.gif                                 // 标记,是否同组的项复选框都被选中 
InBlock.gif                                var bln =  true
InBlock.gif                                 for (var j=0; j<aryItem.length; j++) 
InBlock.gif                                { 
InBlock.gif                                         // 如果该项复选框没被选中,并且不是disabled,则bln设为false 
InBlock.gif                                         if (!GetObject(aryItem[j]). checked && !GetObject(aryItem[j]).parentElement.disabled) 
InBlock.gif                                        { 
InBlock.gif                                                bln =  false
InBlock.gif                                                 break
InBlock.gif                                        } 
InBlock.gif                                } 
InBlock.gif                                 
InBlock.gif                                 // bln为true,则设置同组的全选复选框为选中 
InBlock.gif                                 if (bln) 
InBlock.gif                                { 
InBlock.gif                                        GetObject(aryAlls[i]). checked =  true
InBlock.gif                                } 
InBlock.gif                                 // 否则 
InBlock.gif                                 else 
InBlock.gif                                { 
InBlock.gif                                        GetObject(aryAlls[i]). checked =  false
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                function GetObject(param) 
InBlock.gif                { 
InBlock.gif                         return document.getElementById(param); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 //]]> 
InBlock.gif                </script>"; 
InBlock.gif        } 
InBlock.gif}
 
3、新建一个CheckboxAll类,有两个属性
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.ComponentModel; 
InBlock.gif using System.Web.UI; 
InBlock.gif 
InBlock.gif namespace YYControls.SmartGridView 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// CheckboxAll 的摘要说明。 
InBlock.gif         /// </summary> 
InBlock.gif        [ToolboxItem( false)] 
InBlock.gif         public  class CheckboxAll 
InBlock.gif        { 
InBlock.gif                 private  string _checkboxAllID; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 模板列全选复选框ID 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  string CheckboxAllID 
InBlock.gif                { 
InBlock.gif                        get {  return _checkboxAllID; } 
InBlock.gif                        set { _checkboxAllID = value; } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  string _checkboxItemID; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 模板列项复选框ID 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  string CheckboxItemID 
InBlock.gif                { 
InBlock.gif                        get {  return _checkboxItemID; } 
InBlock.gif                        set { _checkboxItemID = value; } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// ToString() 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  override  string ToString() 
InBlock.gif                { 
InBlock.gif                         return  "CheckboxAll"
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
 
 



     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/345477,如需转载请自行联系原作者



相关文章
|
5月前
|
开发者
jeDate日期控件的使用以及选中后点确定按钮关闭功能
jeDate日期控件的使用以及选中后点确定按钮关闭功能
47 0
|
5月前
|
前端开发
uniapp checkbox样式失效,选中框选中按钮不显示
uniapp checkbox样式失效,选中框选中按钮不显示
85 0
|
11月前
|
XML Java API
按钮和复选框控件
按钮和复选框控件
53 0
|
存储 关系型数据库 MySQL
Easyui datagrid combobox输入框下拉(取消)选值和编辑已选值处理
Easyui datagrid combobox输入框下拉(取消)选值和编辑已选值处理
348 0
【Layui】关于单选框的选中状态,下拉框默认显示
【Layui】关于单选框的选中状态,下拉框默认显示
598 0
【Layui】关于单选框的选中状态,下拉框默认显示
QT应用编程: QTableWidget删除选中的多行与全选、取消全选
QT应用编程: QTableWidget删除选中的多行与全选、取消全选
953 0
QT应用编程: QTableWidget删除选中的多行与全选、取消全选
|
JavaScript
freemaker页面复选框全选与反选
freemaker页面复选框全选与反选
|
前端开发 开发者 移动开发
bootstrap treeview 自定义全选 / 全部取消选中
bootstrap treeview默认不提供全选 / 全部取消操作, 需要开发者自定义. 自定义效果如下, 点击父节点, 子节点全部选中, 再次点击, 子节点全部取消选中. 在笔者的情况下, 需要实现父节点的单独选中, 所以这里做了子节点全部不选中的情况下, 依然保持父节点单独选中状态.
4700 0