TreeView如何实现 这样的功能 1.选中父节点 子节点全部选中 
2.选中部分子节点 父节点是方框选中 半选中 
3.选中全部子节点 父节点选中 就像Windows一样 

解决方案 »

  1.   

      function OnTreeNodeChecked() 
        { 
            var ele = event.srcElement; 
            if(ele.type=='checkbox') 
            { 
                
                var childrenDivID = ele.id.replace('CheckBox','Nodes'); 
                var div = document.getElementById(childrenDivID); 
                if(div==null)
                    return; 
                    
                var checkBoxs = div.getElementsByTagName('INPUT'); 
                for(var i=0;i<checkBoxs.length;i++) 
                { 
                    if(checkBoxs[i].type=='checkbox') 
                        checkBoxs[i].checked=ele.checked; 
                }             if(ele.parentNode.parentNode.parentNode.parentNode.parentNode.id=='<%=TreeUser.ClientID%>')
                {
                    if(current==null)
                    {
                        current=ele;
                    }
                    else
                    {
                                        
                        current.checked=false;
                        childrenDivID = current.id.replace('CheckBox','Nodes'); 
                        div = document.getElementById(childrenDivID); 
                        if(div!=null)
                        {                            
                            checkBoxs = div.getElementsByTagName('INPUT'); 
                            for(var i=0;i<checkBoxs.length;i++) 
                            { 
                                if(checkBoxs[i].type=='checkbox') 
                                    checkBoxs[i].checked=false; 
                            }
                        } 
                        if(current==ele)
                        {
                            current=null;
                        }
                        else
                        {
                            current=ele;
                            
                        }
                    }
                }           
            } 
        } 
         
      

  2.   

    有半选中  那就不能用 自带的Checkbox了 
    可以在几点前面加图片   没选中 图片  选中 图片  半选中 图片 
    根据不同的情况换图片
      

  3.   

    这个估计得自己写控件了,因为treeview的复选样式就两种状态,不像checkedlistbox有三种
      

  4.   

    使用checkstate 给checkbox赋值,有三种状态。选中 checked
    不选中  unchecked
    不确定  interminate(类似这个名字)--你要求的半选中。
      

  5.   

    不好意思,看错题目了。这个问题我的解决办法是  给treeviwe的imagelist添加3个分别表示三个状态的image通过设置 选择的image来表示其选中状态。
      

  6.   


            //改变所有子节点的状态
            public static void CheckAllChildNodes(TreeNode pn, bool IsChecked)
            {
                foreach (TreeNode tn in pn.Nodes)
                {
                    tn.Checked = IsChecked;
                    if (tn.Nodes.Count > 0)
                    {
                        CheckAllChildNodes(tn, IsChecked);
                    }
                }
            }        //改变父节点的选中状态
            public static void CheckParentNode(TreeNode curNode, bool IsChecked)
            {
                bool bChecked = true;            if (curNode.Parent != null)
                {
                    foreach (TreeNode node in curNode.Parent.Nodes)
                    {
                        if (node.Checked == false)
                        {
                            bChecked = false;
                            break;
                        }
                    }                if (bChecked)
                    {
                        curNode.Parent.Checked = true;
                        CheckParentNode(curNode.Parent, true);
                    }
                    else
                    {
                        curNode.Parent.Checked = false;
                        CheckParentNode(curNode.Parent, false);
                    }
                }
            }
      

  7.   

    半选中只能用其他控件  treeview 没有半选中状态!
      

  8.   

    function postBackObject() {
                var o = window.event.srcElement;
                if (o.tagName == "INPUT" && o.type == "checkbox") {//点击treeview的checkbox是否触发
                    var d = o.id; //获得当前checkbox的id
                    var e = d.replace("CheckBox", "Nodes"); //通过查看脚本信息,获得包含所有子节点的div的id
                    var div = window.document.getElementById(e); //获得div对象
                    if (div != null) {//如果不为空,表示存在子节点
                        var check = div.getElementsByTagName("INPUT"); //获得div中所有的已input开始的标记
                        for (i = 0; i < check.length; i++) {
                            if (check[i].type == "checkbox") {
                                check[i].checked = o.checked; //子节点和父节点的状态一致,即全选
                            }
                        }
                    } else {//点击子节点的时候,是父节点的状态改变,即不为全选
                        var divid = o.parentElement.parentElement.parentElement.parentElement.parentElement; //子节点所在的div
                        var id = divid.id.replace("Nodes", "CheckBox"); //获得根节点的id
                        var checkbox = divid.getElementsByTagName("INPUT"); //获得所有子节点数
                        var s = 0;
                        for (i = 0; i < checkbox.length; i++) {
                            if (checkbox[i].checked) {
                                s++;
                            }
                        }
                        if (s == checkbox.length) {//如果全部选中或选择的是另外一个根节点的子节点,
                            window.document.getElementById(id).checked = true; //则开始的根节点仍为选中状态
                        } else {
                            window.document.getElementById(id).checked = false;
                        }
                    }
                }
            }
    额,没有半选中的