C#基础回顾:GridView全选演示

      要实现的效果:

      方法一:

      首先,你需要添加一列,用于放置复选框.如果你比较熟练,可以直接通过手动写代码来实现.如果,你还比较生疏,那么就进入设计页面,选择你的GridView控件.点击右上角的三角尖:


      选择编辑列:

      添加一个模板列TemplateField.然后,切换到源代码进行后续的编辑.在你的GridView控件中刚刚生成的 <asp:TemplateField> </asp:TemplateField>标签对之间,添加一个<HeaderTemplate></HeaderTemplate>标签对和<ItemTemplate></ItemTemplate>标签对.这两个是什么意思呢?按照字面理解,应该是头模板和项目模板.联想一下我们的GridView控件,是不是有一个Header用来显示列名之类的信息,而Header之下都是我们从数据源获取的数据行呢?(当然,还有其它情况,这里不做讨论).如果你想明白了,那应该已经猜到这两个标签对是做什么用的了.我们要利用<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" 语句,就如上面所给的代码一样.AutoPostBack属性必须设置为true(默认为false),因为我们需要在点选该checkbox后,就让其它数据行的checkbox也选中,也就是说必须告诉服务器"我已经选中了",只有当服务器接收到该消息,才会执行SelectAll方法.而AutoPostBack属性就是用于设置回发的,如果设置为true,表是点选该按钮后,就会将消息传给服务器端,否则就不会将消息传给服务器.
      啰嗦了一大堆后,继续回来.SelectAll方法如下:
ContractedBlock.gif ExpandedBlockStart.gif 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;
    }
}

      这样,便实现了预定的效果. [备忘:GridView数据呈现形式有点像Excel,也是由行列组成,每一行又由许多单元格组成,在每一个单元格内又可以放置任意多的东西(包括控件),因此如果我们想要得到GridView某行某列的某个控件,就要用GridView.Rows[index].Cells[index].Controls[index]之类的方式]

      方法二:

      但是,很明显,采用postBack方式并不是最好的,每次点选都会产生一次回发,服务器都需要进行处理,这对服务器性能影响是很大的.(一个用户可能还感觉不出来,如果有上千个用户呢?).因此,最好的办法,就是让客户端自己去处理选中的事件.这就需要js来帮忙.

ContractedBlock.gif ExpandedBlockStart.gif 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;
        }
    }
}
</script>

      把上述js代码添加到Head标签中.然后对GridView源代码进行一些修改,去掉OnCheckedChanged="SelectAll" AutoPostBack="true",添加οnclick="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.如果,对于我所说的还不理解,请仔细阅读代码.

ContractedBlock.gif ExpandedBlockStart.gif 注册JS
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);
    }
}

 

      这样,就基本可以满足要求了.

      源文件下载.(采用VS 2005开发)

作者: stg609
出处: http://stg609.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值