TreeView设置checkbox事件__doPostBack()

ASP.NET 2.0使用TreeView控件时发现带有CheckBox控件的TreeNode对象(Treeview节点),选择CheckBox无法回发页面。在MSDN中对于TreeView, TreeNodeCheckChanged事件有一段备注:“当TreeView控件的复选框的两次向服务器发送之间要更改状态时,会引发TreeNodeCheckChanged事件。这使您可以提供一个这样的事件处理方法,即每次发生此事件时执行一个自定义例程(如更新数据库或显示的内容)。尽管TreeNodeCheckChanged事件在回发时激发,但更改复选框不会导致回发。”说明框架本身并不提供一个CheckBoX回发的机制。
      尽管点击CheckBox不会引起回发(PostBack),这样做能够做到checkbox的自动回发。
      但在构建树的时候,是没有办法在TreeNode上定义事件,所有我们把这个事件加在TreeView上。
 
TreeView1.Attributes.Add("onclick", "postBackByObject()"); //注册客户端事件
 

 1 <script type="text/javascript">
 2 function postBackByObject()
 3 {
 4       var o = window.event.srcElement;
 5       //判断激发的对象是否为checkbox,如果是则激发__doPostBack("","");
 6       //因为前台生成的checkbox是"<input type='checkbox'./> "
 7       //所以判断如下:
 8       if(o.tagName == "INPUT" && o.type == "checkbox")
 9       {
10            __doPostBack("","");    //注意:__doPostBack中为两个下划线组成"_"
11       }
12 }
13 </script>
 
      在.NET中,所有的服务器控件提交到服务器的时候,都会调用__doPostBack("","")这个函数。
 第一个参数是你希望提交到服务器的控件的ID号,第二个参数为事件参数。
      __doPostBack()函数不是每次后台编译都生成,拉或者出一个TreeView或者DataGrid它就会有。如果没有,我们也可以在后台添加它。
      __doPostBack()的原型如下:
   

 1 <script type="text/javascript">
 2 <!--
 3 var theForm = document.forms['form1'];
 4 if (!theForm) {
 5     theForm = document.form1;
 6 }
 7 function __doPostBack(eventTarget, eventArgument) {
 8     if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
 9         theForm.__EVENTTARGET.value = eventTarget;
10         theForm.__EVENTARGUMENT.value = eventArgument;
11         theForm.submit();
12     }
13 }
14 // -->
15 </script>
 
      其它控件也可以调用这个事件。比如:TextBox1.Attributes["onclick"] = "__doPostBack(Button1,")",那它不仅可以返回服务器处理,还能调用其它控件的特有函数。
      后台CS代码如下:
     

 1 #region 级联父子节点的复选框状态
 2
 3     protected void TreeView_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
 4     {
 5         SetChildChecked(e.Node);
 6         //判断是否根节点
 7         if (e.Node.Parent != null)
 8         {
 9             SetParentChecked(e.Node);
10         }
11     }
12
13     /// <summary>
14     /// 根据父节点状态设置子节点的状态
15     /// </summary>
16     /// <param name="parentNode"></param>
17     private void SetChildChecked(TreeNode parentNode)
18     {
19         foreach (TreeNode node in parentNode.ChildNodes)
20         {
21             node.Checked = parentNode.Checked;
22             if (node.ChildNodes.Count > 0)
23             {
24                 SetChildChecked(node);
25             }
26         }
27     }
28
29     private void SetParentChecked(TreeNode childNode)
30     {
31         TreeNode parentNode = childNode.Parent;
32         if (!parentNode.Checked && childNode.Checked)
33         {
34             int ichecks = 0;
35             foreach (TreeNode node in parentNode.ChildNodes)
36             {
37                 if (node.Checked)
38                 {
39                     ichecks++;
40                 }
41             }
42             if (ichecks == parentNode.ChildNodes.Count)
43             {
44                 parentNode.Checked = true;
45                 if (parentNode.Parent != null)
46                 {
47                     SetParentChecked(parentNode);
48                 }
49             }
50         }
51         else if (parentNode.Checked && !childNode.Checked)
52         {
53             parentNode.Checked = false;
54         }
55     }
56
57     #endregion

转载于:https://www.cnblogs.com/sunxi/archive/2012/07/01/2571626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值