现在树已经显示出来了,前面还加了checkbox
现在想实现以下功能:
点击父节点的checkbox他的子节点的checkbox全部选中,
点击某个子节点,他的父节点(包括父节点的以上的所有节点)要选中。
请问如何实现?提供思路也可!up有分!

解决方案 »

  1.   

    你的树是用什么做的。TreeView>?
      

  2.   

    1)
    void checkChilds(TreeNode node)
    {
        for(int i=0;i<node.Nodes.Count;i++)
        {
            TreeNode childNode = node.Nodes[i];
            childNode.Checked = true;
            if(childNode.Nodes.Count>0) checkChilds(childNode);
        }
    }
      

  3.   

    2)
    TreeNode tmpNode = 点击的节点
    while(tmpNode != null)
    {
      tmpNode.Checked = true;
      
      try 
      { 
        tmpNode = (TreeNode)tmpNode.Parent;
      }
      catch
      {
        tmpNode = null;
      }
    }
      

  4.   

    http://dev.csdn.net/develop/article/22/article/29/29028.shtm
      

  5.   

    //一段超晕的代码,实现树上结点的单选和复选的功能
    //单击TreeView
    function treeview_onclick(e){
    //获取单击TreeView控件treenode编号
    var i=e.clickedNodeIndex;
    if(i==null){
    return false;
    }
    var node =e.getTreeNode(i);

    //获取原始状态
    var checked;
    try{
    checked= node.getAttribute("checked");
    }catch(e){
    checked=false;
    }
    //改变选择的按钮状态
    checked = !checked;
    try{
    node.setAttribute("checked",checked);
    }
    catch(e){
    alert(e.description)
    }
    if(node.getAttribute("subtree")!=null){
    var all=node.getAttribute("subtree").all;
    checksubtree(all,checked);
    }
    }
    var type="";
    function checksubtree(all,checked){
      for(i=0;i<all.length;i++){
    if(all[i].type =="checkbox"){
        all[i].checked = checked;
    setchecked(all[i],checked)
    type="checkbox";
    }
    if(all[i].type=="radio") //radio类型需要单独处理
    {
    if(type!="radio"){
    all[i].checked = checked;
    setchecked(all[i],checked)
    type ="radio";
    }
    else{
    setchecked(all[i],false)
    type ="radio";
    }
    }
    }
    type="";
    }
    function setchecked(chk,checked){
    //清除相同的选项
    var hide = document.getElementById("hiddenField");
    var checkedstr = hide.value;
    if(checkedstr.charAt(0)!=";")
    checkedstr += ";";
    checkedstr=checkedstr.replace(";"+chk.id+";",";");
    //如果类型为radio需要清除以前选择的记录
    if((chk.type =="radio") &&(chk.checked)){
        //radiobox编号规则为 综合报告代码+"_"+基础报告代码+"_"+试验项目代码+"_"+试验指标序号
    var i = chk.id.lastIndexOf("_");
    var no = chk.id.substring(0,i+1);//like LA_LA01_001_
        
    //通过;进行拆分,查找出以前选择的同类复选信息进行处理
    var arr =checkedstr.split(";");
    //重新对checkedstr进行赋值
    checkedstr=";";
    for(i=0;i<arr.length;i++){
        if(arr[i] =="")
    continue;

    if(arr[i].indexOf(no) =="-1"){ //表示不存在同时需要排除单选框的存在情况
    checkedstr+=arr[i]+";";
    }
    }
    }
    if(checked){ //增加选择
    checkedstr += chk.id+";";
    }
    hide.value =checkedstr;
    }
      

  6.   

    对呀!用的是treeview,楼上好几位咋写的是服务器段的代码,我要的是客户端的,
      

  7.   

    搞定了!现在用的是解析nodeIndex来得到父节点的,有没有更好的方法?
      

  8.   

    private void tvAccAuxItem_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
    tvAccAuxItem.SelectedNode = e.Node;
    tvAccAuxItem.AfterCheck -= new TreeViewEventHandler(tvAccAuxItem_AfterCheck);
    TreeNode node = new TreeNode();
    bool flag = true;
    node = tvAccAuxItem.SelectedNode;

    if (tvAccAuxItem.SelectedNode.Checked == true)
    {
    //如果Checked为true,保证子节点的Checked都为true
    if (tvAccAuxItem.SelectedNode.FirstNode != null)
    {
    node = tvAccAuxItem.SelectedNode.FirstNode;
    while(flag)
    {
    node.Checked = true;
    if (node.FirstNode != null)
    node = node.FirstNode;
    else if (node.NextNode != null)
    node = node.NextNode;
    else 
    while(flag)
    {
    if (node.Parent != tvAccAuxItem.SelectedNode)
    {
    node = node.Parent;
    if (node.NextNode != null)
    {
    node = node.NextNode;
    break;
    }
    }
    else
    {
    flag = false;
    }
    }
    }
    } //望上迭归,保证子节点的Checkecd为true时,父节点的Checked的也为true.
    node = tvAccAuxItem.SelectedNode;
    while (true)
    {
    if (node.PrevNode != null)
    node = node.PrevNode;
    else
    break;
    }
    while (true)
    {
    if (node.Parent != null)
    {
    if (node.NextNode != null && node.Checked == true)
    {
    node = node.NextNode;
    }
    else if (node.NextNode == null && node.Checked == true)
    {
    node = node.Parent;
    node.Checked = true;
    while(true)
    {
    if (node.PrevNode != null)
    node = node.PrevNode;
    else
    break;
    }
    }
    else
    break;
    }
    else
    break;
    }
    tvAccAuxItem.AfterCheck += new TreeViewEventHandler(tvAccAuxItem_AfterCheck);
    return;
    }

    else
    {
    //保证上级节点的Checked都为false
    if (tvAccAuxItem.SelectedNode.Parent != null)
    {
    while (true)
    {
    if (node.Parent != null)
    {
    node = node.Parent;
    node.Checked = false;
    }
    else
    {
    break;
    }
    }
    }
    //保证下级节点的Checked都为false
    if (tvAccAuxItem.SelectedNode.FirstNode != null)
    {
    flag = true;
    node = tvAccAuxItem.SelectedNode.FirstNode;
    while(flag)
    {
    node.Checked = false;
    if (node.FirstNode != null)
    node = node.FirstNode;
    else if (node.NextNode != null)
    node = node.NextNode;
    else 
    while(flag)
    {
    if (node.Parent != tvAccAuxItem.SelectedNode)
    {
    node = node.Parent;
    if (node.NextNode != null)
    {
    node = node.NextNode;
    break;
    }
    }
    else
    {
    flag = false;
    }
    }
    }
    }
    }
    tvAccAuxItem.AfterCheck += new TreeViewEventHandler(tvAccAuxItem_AfterCheck);
    }
      

  9.   

    晕!现在前台功能全实现了!可后台取不到node的checked状态了,把前台脚本去掉就可以获取了,这是啥原因?