zoukankan      html  css  js  c++  java
  • 刚好理解:TreeView设置checkbox事件__doPostBack()

    虽然转了不少,但我要理解透彻,还不容易呢?!!还要能灵活运用哦。搞到凌晨差不多2点.
    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()"); //注册客户端事件
    对应在aspx文件代码中
    <script type="text/javascript">
      function postBackByObject()
      {
            var o = window.event.srcElement;
            //判断激发的对象是否为checkbox,如果是则激发__doPostBack("","");
           //因为前台生成的checkbox是"<input type='checkbox'./> "
            //所以判断如下:
           if(o.tagName == "INPUT" && o.type == "checkbox")
            {
               __doPostBack("Button9","");    //注意:__doPostBack中为两个下划线组成"_"
           }
     }
    </script>
     在.NET中,所有的服务器控件提交到服务器的时候,都会调用__doPostBack("","")这个函数。???

     第一个参数是你希望提交到服务器的控件的ID号,第二个参数为事件参数。该例子中我们用了Button9事件click

    其它控件也可以调用这个事件。比如:TextBox1.Attributes["onclick"] = "__doPostBack(Button1,")",那它不仅可以返回服务器处理,还能调用其它控件的特有函数。

      后台CS代码如下:
    page_load 之前就要
    public static string tmp_node_text;//测试演示用的变量
    page_load 后就如下:

     protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
        {
            tmp_node_text = e.Node.Text;//测试演示用的附值
            SetChildChecked(e.Node);//先置子节点
            if (e.Node.Parent !=null) //判断不为为空
            {
                SetParentChecked(e.Node);//置父节点
            }

        }
        private void SetChildChecked(TreeNode parentNode)// 根据父节点状态设置子节点的状态

         {
             foreach (TreeNode node in parentNode.ChildNodes)
            {
                 node.Checked = parentNode.Checked; //如果父节点选了就没的好说了,为有选定
                 if (node.ChildNodes.Count > 0)//如果有多个子节点则 只把该子节点置为选定
                 {
                    SetChildChecked(node);
                 }
             }
         }
            /// 根据子节点状态设置父节点的状态     
         private void SetParentChecked(TreeNode childNode)
         {
             TreeNode parentNode=childNode .Parent ; 
            if (!parentNode.Checked && childNode.Checked)//父节点不选定而子节点选定
             {
                 int ichecks = 0;
                 foreach (TreeNode node in parentNode.ChildNodes)
                 {
                     if (node.Checked)
                     {
                         ichecks++;
                     }
                 }

                 if (ichecks == parentNode.ChildNodes.Count)//如果刚好全部子选定,则相当于父也被选定了
                 {
                     parentNode.Checked = true;
                     if (parentNode.Parent!=null)
                     {
                         SetParentChecked(parentNode);//父也被选定
                     }
                 }
             }
             else if (parentNode.Checked && !childNode.Checked)//如果父选定而子没有选定,则该父下的子节点全部选定
             {
                 parentNode.Checked = false;
             }
         }
       
        protected void Button9_Click(object sender, EventArgs e) //被调用Button9后输出测试,到底选择了那个节点
        {
            Response.Write("<script language=javascript>alert('"+tmp_node_text+"')</script>");
         }

    总算弄个基本明白了。好痛苦啊.忙了两天啦.该问题啊...呵呵.. 

  • 相关阅读:
    Docker启动ubuntu容器中使用sudo后报错,bash: sudo: command not found
    Redis持久化rdb&aof
    Python3中copy模块常用功能及其他几种copy方式比较
    学习笔记:tkinter模块常用参数(python3)
    Python核心编程第二版(中文).pdf 目录整理
    11、487-3279
    10、Crashing Balloon
    9、Exponentiation
    8、Fire Net
    7、Reverse Root
  • 原文地址:https://www.cnblogs.com/pyman/p/1551099.html
Copyright © 2011-2022 走看看