GridView中CheckBox实现全选或反选功能的方法
来源:互联网 发布:淘宝旗帜店 编辑:程序博客网 时间:2024/05/19 14:40
方法一:
添加一个模板列TemplateField.然后,切换到源代码进行后续的编辑.
在GridView控件中刚刚生成的<asp:TemplateField> </asp:TemplateField>标签对之间,
添加一个<HeaderTemplate></HeaderTemplate>标签对和
<ItemTemplate></ItemTemplate>标签对.
我们利用<HeaderTemplate>在列头处显示一个checkbox,
用这个checkbox来触发全选和全不选的事件.而在<ItemTemplate>中添加的checkbox则会显示在每一条数据行中.
下面来看源代码:
<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox runat="server" ID="cbHead" OnCheckedChanged="SelectAll" AutoPostBack="true">
</asp:CheckBox>
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox runat="server" ID="cbItem"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
上面的代码相信大家肯定看明白了,那如何来实现全选和全不选呢?这就需要编辑SelectAll方法,
因为当我们点选了列头的checkbox就会触发OnCheckedChanged事件,而我们让该事件调用SelectAll方法,
利用该方法来实现效果.要添加该事件,首先要在源代码中添加OnCheckedChanged="SelectAll" AutoPostBack="true"
语句,因为我们需要在点选该checkbox后,就让其它数据行的checkbox也选中,也就是说必须告诉服务器"我已经选中了",
只有当服务器接收到该消息,才会执行SelectAll方法.而AutoPostBack属性就是用于设置回发的,如果设置为true,
表是点选该按钮后,就会将消息传给服务器端,否则就不会将消息传给服务器.
SelectAll方法如下:
protected void SelectAll(object sender, EventArgs e)
{
bool isChecked = ((CheckBox)(GridView1.HeaderRow.Cells[0].FindControl("cbHead"))).Checked;
foreach (GridViewRow gvRow in GridView1.Rows)
{
((CheckBox)(gvRow.Cells[0].FindControl("cbItem"))).Checked = isChecked;
}
}
方法二:
但是,很明显,采用postBack方式并不是最好的,每次点选都会产生一次回发,服务器都需要进行处理,这对服务器性能影响是很大的.(一个用户可能还感觉不出来,如果有上千个用户呢?).因此,最好的办法,就是让客户端自己去处理选中的事件.这就需要js来帮忙.
selectAll
<script language="javascript" type="text/javascript">
{
function selectAll(ctlName,bool)
{
var ctl = document.getElementById(ctlName);//根据控件的在客户端所呈现的ID获取控件
var checkbox = ctl.getElementsByTagName('input');//获取该控件内标签为input的控件
/*所有Button、TextBox、CheckBox、RadioButton类型的服务器端控件在解释成Html控件后,都为<input type=''./>,通过type区分它们的类型。*/
for(var i=0;i<checkbox.length;i++)
{
if(checkbox[i].type=='checkbox')
{
checkbox[i].checked = bool;
}
}
把上述js代码添加到Head标签中.然后对GridView源代码进行一些修改,去掉OnCheckedChanged="SelectAll" AutoPostBack="true",添加onclick="javascript.:selectAll('GridView3',this.checked);"客户端事件.
那么现在,当你再点选列头的checkbox时候就不会回发给服务器端处理了.
方法三:
有些朋友发现问题了,在上述的Js中,单纯地通过checkbox[i].type=='checkbox'来做判断,
那不是意味着只要GridView控件中有checkbox,就对它进行了赋值吗,如果在其它列中也有复选框,那不是也受到连累了?
因此上述方法只适合于只有一列复选框的情况,但是如果出现多列复选框,怎么办呢?
我想到的方法就是通过名字来设置每一个复选框,也就是只有名字是符合的,我才对它进行操作.
你可能会希望使用getElementsByName("checkbox名称")来获取控件,但是会发现,这样根本查找不到控件.
因为asp.net中,为了防止绑定列在解释成HTML后出现ID、Name相同的控件,对每一个ID和NAME都进行了修改.
大家可以参考这里.因此,我们只能利用控件的ClientID来获取修改后的ID.
于是我通过在cs代码中注册js脚本来获取到该ID.如果,对于我所说的还不理解,请仔细阅读代码.
private void RegisterScript(GridView gv)
{
if (!ClientScript.IsStartupScriptRegistered("selectJSFor" + gv.ID))
{
string script = "<script language='javascript'>/n"
+ "function selectAllFor" + gv.ID + "(bool)/n"
+ "{/n";
for (int i = 0; i < GridView3.Rows.Count; i++)
{
script += "document.getElementById('" + gv.Rows[i].Cells[0].FindControl("cbItem").ClientID + "').checked=bool;/n";
}
script += "}/n"
+ "</script>/n";
ClientScript.RegisterStartupScript(this.GetType(), "selectJSFor" + gv.ID, script);
}
这样,就基本可以满足要求了.
方法四:
function SelectAll(aControl) {
var tempControl = aControl;
var isChecked = tempControl.checked;
elem = tempControl.form.elements;
for (i = 0; i < elem.length; i++)
if (elem[i].type == "checkbox" && elem[i].id != tempControl.id) {
if (elem[i].checked != isChecked)
elem[i].click();
}
}
</script>
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="cbItem" runat="server" />
</ItemTemplate>
<HeaderTemplate>
<asp:CheckBox ID="cbAll" runat="server" Text="All" AutoPostBack="True"
onclick="javascript:SelectAll(this)" />
</HeaderTemplate>
</asp:TemplateField>
<Columns>
- GridView中CheckBox实现全选或反选功能的方法
- GridView中实现类邮件的CheckBox全选功能
- GridView中实现类邮件的CheckBox全选功能
- 全选/取消 gridview中checkbox的功能实现
- GridView中实现反选和全选功能
- Jquery实现checkbox的全选、反选功能代码
- jQuery(5)--实现checkbox的全选,反选,全不选功能
- 使用js实现checkbox的全选与反选功能
- CheckBox的全选或反选
- 如何实现listView中checkbox的全选与反选功能
- checkbox利用JQuery实现全选、反选的方法
- asp.net 中GridView控件实现全选及反选的功能
- asp.net 中GridView控件实现全选及反选的功能
- asp.net 中GridView控件实现全选及反选的功能
- asp.net 中GridView控件实现全选及反选的功能
- checkbox全选或反选
- Form中实现Checkbox全选反选
- 在Repeater中实现CheckBox 的全选及反选
- 解决visual studio有时无法设置断点的问题
- js获取鼠标点击位置(界面的位置,可以使用top和left直接定位的)
- 无类型文件Demo
- 在8位单片机中的浮点数运算---开方,乘法,除法,反正切
- Mac OS X 系统下的安装httpd
- GridView中CheckBox实现全选或反选功能的方法
- Android WakeLock相关功能搜集
- VS2005 C++ OmniORB 使用NameService方式 实现CORBA
- Func和Action委托的区别和简单使用
- CEdit控件禁止右键的粘贴,禁止右键菜单
- 身边一位SDET推荐的关于测试的书
- opencv 64位
- Android目录及其文件说明
- 转linq to sql