平时使用GridView的时候经常要给每行加一个复选框,然后还需要放置一个单独的全选复选框,通过单击它来让这些复选框全选或取消全选,每次实现这样的功能都要写一段javascript,麻烦,所以扩展它。


控件开发
1、新建一个继承自GridView的类。


/**/ 
 ///<summary>
///继承自GridView
///</summary> 
 
[ToolboxData( 
 @" 
 <{0}:SmartGridViewrunat='server'></{0}:SmartGridView> 
 " 
 )]
 
 public 
  
 class 
 SmartGridView:GridView
 
 
 
 {
} 

2、新建一个JavaScriptConstant类,把我们要用到的javascript存在一个常量里 

  
using  System;
  using 
 System.Collections.Generic;
  using 
 System.Text;

  namespace 
 YYControls.SmartGridView
  
  {
/**////<summary>
///javascript
///</summary>
publicclassJavaScriptConstant
{
internalconststringjsCheckAll=@"<scripttype=""text/javascript"">
//<![CDATA[

//隐藏字段的ID,用于存每组的全选复选框ID
varhdnAllName='[$AllName$]';
//隐藏字段的ID,用于存每的项复选框ID
varhdnItemName='[$ItemName$]';
//组分隔符,一个全选复选框和其对应的n个项复选框为一个组
vargroupSeparator='[$GroupSeparator$]';
//项分隔符,项复选框每个项之间的分隔符
varitemSeparator='[$ItemSeparator$]';

varstrAlls=GetObject(hdnAllName).value;
varstrItems=GetObject(hdnItemName).value;

//全选复选框数组
vararyAlls=strAlls.split(groupSeparator);
//项复选框数组,每行有一个组的所有项复选框
vararyItems=strItems.split(groupSeparator);

//全选复选框被单击,参数为该全选复选框这个对象
functionClickCheckAll(objAll)
{
//每个全选复选框
for(vari=0;i<aryAlls.length;i++)
{
//该全选复选框是所单击的全选复选框
if(aryAlls[i]==objAll.id)
{
//该全选复选框同组下的项复选框数组
aryItem=aryItems[i].split(itemSeparator);
for(varj=0;j<aryItem.length;j++)
{
//单击的全选复选框是选中状态,并且项复选框不是disabled,则选中
if(objAll.checked&&!GetObject(aryItem[j]).parentElement.disabled)
{
GetObject(aryItem[j]).checked=true;
}
//否则
else
{
GetObject(aryItem[j]).checked=false;
}
}

break;
}
}
}

//项复选框被单击
functionClickCheckItem()
{
//每组项复选框
for(vari=0;i<aryItems.length;i++)
{
//该组的所有项复选框数组
aryItem=aryItems[i].split(itemSeparator);
//标记,是否同组的项复选框都被选中
varbln=true;
for(varj=0;j<aryItem.length;j++)
{
//如果该项复选框没被选中,并且不是disabled,则bln设为false
if(!GetObject(aryItem[j]).checked&&!GetObject(aryItem[j]).parentElement.disabled)
{
bln=false;
break;
}
}

//bln为true,则设置同组的全选复选框为选中
if(bln)
{
GetObject(aryAlls[i]).checked=true;
}
//否则
else
{
GetObject(aryAlls[i]).checked=false;
}
}
}

functionGetObject(param)
{
returndocument.getElementById(param);
}

//]]>
</script>";
}
}  
 

3、新建一个CheckboxAll类,有两个属性 

  
using  System;
  using  System.Collections.Generic;
  using  System.Text;

  using  System.ComponentModel;
  using  System.Web.UI;

  namespace  YYControls.SmartGridView
  
  {
/**////<summary>
///CheckboxAll的摘要说明。
///</summary>
[ToolboxItem(false)]
publicclassCheckboxAll
{
privatestring_checkboxAllID;
/**////<summary>
///模板列全选复选框ID
///</summary>
publicstringCheckboxAllID
{
get
{return_checkboxAllID;}
set
{_checkboxAllID=value;}
}

privatestring_checkboxItemID;
/**////<summary>
///模板列项复选框ID
///</summary>
publicstringCheckboxItemID
{
get
{return_checkboxItemID;}
set
{_checkboxItemID=value;}
}

/**////<summary>
///ToString()
///</summary>
///<returns></returns>
publicoverridestringToString()
{
return"CheckboxAll";
}
}
}  
 

4、新建一个继承自CollectionBase的类CheckboxAlls 

  
using  System.Collections;
  using  System.ComponentModel;
  using  System.Web.UI;

  namespace  YYControls.SmartGridView
  
  {
/**////<summary>
///CheckboxAlls的摘要说明。
///注意要继承自CollectionBase
///</summary>
[
ToolboxItem(false),
ParseChildren(true)
]
publicclassCheckboxAlls:CollectionBase
{
/**////<summary>
///构造函数
///</summary>
publicCheckboxAlls()
:base()
{
}

/**////<summary>
///实现IList接口
///获取或设置指定索引处的元素。
///</summary>
///<paramname="index">要获得或设置的元素从零开始的索引</param>
///<returns></returns>
publicCheckboxAllthis[intindex]
{
get
{
return(CheckboxAll)base.List[index];
}
set
{
base.List[index]=(CheckboxAll)value;
}
}

/**////<summary>
///实现IList接口
///将某项添加到System.Collections.IList中。
///</summary>
///<paramname="item">要添加到System.Collections.IList的System.Object。</param>
publicvoidAdd(CheckboxAllitem)
{
base.List.Add(item);
}

/**////<summary>
///实现IList接口
///从System.Collections.IList中移除特定对象的第一个匹配项。
///</summary>
///<paramname="index">要从System.Collections.IList移除的System.Object</param>
publicvoidRemove(intindex)
{
if(index>-1&&index<base.Count)
{
base.List.RemoveAt(index);
}
}
}
}  
 

5、在继承自GridView的类中加一个复杂对象属性,该复杂对象就是第4步创建的那个CheckboxAlls 

  
  private  CheckboxAlls_checkboxAlls;
  /**/  ///<summary>
///复选框组集合一个组由一个全选复选框和多个项复选框组成
///</summary>  
[
PersistenceMode(PersistenceMode.InnerProperty),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
Description(  "  复选框组集合一个组由一个全选复选框和多个项复选框组成  "  ),
Category(  "  扩展  "  )
]
  public    virtual  CheckboxAllsCheckboxAlls
  
  {
get
{
if(_checkboxAlls==null)