平时使用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)