就是实现父节点打钩,子节点全部打钩;子节点全钩则父节点自动钩的功能

解决方案 »

  1.   

    选中后,子节点的变化private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        CheckChildNode(e.Node);
    }public void CheckChildNode(TreeNode node)
    {
        if (node.GetNodeCount(false) > 0)
        {
            foreach (TreeNode childnode in node.Nodes)
            {
                childnode.Checked = node.Checked;            if (childnode.GetNodeCount(false) > 0)
                {
                    CheckChildNode(childnode);
                }
            }
        }
    }
    全部选中后,上级节点的代码与此相似
      

  2.   


    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        CheckParentNode(e.Node);
    }public void CheckParentNode(TreeNode node)
    {
        if (node.Parent != null)
        {
            foreach (TreeNode childnode in node.Parent.Nodes)
            {
                if (childnode.Checked != node.Checked) return;
            }
            node.Parent.Checked = node.Checked;
            CheckParentNode(node.Parent);
        }
    }
    上面两种是全部的
      

  3.   

    7楼与8楼的代码,单独运行没问题正确,合起来死循环。 改进了一下:private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        CheckChildNode(e.Node);
        CheckParentNode(e.Node);
    }public void CheckChildNode(TreeNode node)
    {
        if (node.GetNodeCount(false) > 0)
        {
            foreach (TreeNode childnode in node.Nodes)
            {
                if (childnode.Checked != node.Checked)
                    childnode.Checked = node.Checked;
                if (childnode.GetNodeCount(false) > 0)
                {
                    CheckChildNode(childnode);
                }
            }
        }
    }
    public void CheckParentNode(TreeNode node)
    {
        if (node.Parent != null)
        {
            foreach (TreeNode childnode in node.Parent.Nodes)
            {
                if (childnode.Checked != node.Checked) return;
            }
            if (node.Parent.Checked != node.Checked)
                node.Parent.Checked = node.Checked;
            CheckParentNode(node.Parent);
        }
    }
      

  4.   


    //下班了 这个只适合2级节点  要适合更多的需要用递归
    //难得写了
    //楼上的2个方法放一起 ,会产生死循环的
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
          TreeNode parentnode = e.Node.Parent;
          TreeNodeCollection childnode = e.Node.Nodes;
          bool check = e.Node.Checked;      foreach (TreeNode tn in childnode)
          {
            tn.Checked = check;
          }      if (parentnode != null)
          {
            int i = 0;
            int j = 0;
            foreach (TreeNode tn in parentnode.Nodes)
            {
              if (tn.Checked)
              {
                i++;
              }
              else
              {
                j++;
              }        }
            if (i == parentnode.Nodes.Count || j == parentnode.Nodes.Count)
            {
              parentnode.Checked = check;
            }
          }
        }
      

  5.   

    我也写一段
     private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                this.treeView1.AfterSelect -= new TreeViewEventHandler(treeView1_AfterSelect);
                //先处理父节点,只处理上一层
                if (e.Node.Parent != null)
                {
                    foreach (TreeNode childnode in e.Node.Parent.Nodes)
                    {
                        if (childnode.Checked != e.Node.Checked) return;
                    }
                    if (e.Node.Parent.Checked != e.Node.Checked)
                        e.Node.Parent.Checked = e.Node.Checked;
                }            //处理子节点,只处理一层
                if (e.Node.Nodes.Count> 0)
                {
                    foreach (TreeNode childnode in e.Node.Nodes)
                    {
                        childnode.Checked = e.Node.Checked;
                    }
                }
                this.treeView1.AfterSelect+=new TreeViewEventHandler(treeView1_AfterSelect);
            }
      

  6.   

    另一个,前一个有问题        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                this.treeView1.AfterSelect -= new TreeViewEventHandler(treeView1_AfterSelect);
                //先处理父节点,只处理上一层
                if (e.Node.Parent != null&&e.Node.Checked!=e.Node.Parent.Checked)
                {
                    bool childcheck = true;
                    foreach (TreeNode childnode in e.Node.Parent.Nodes)
                    {
                        if (childnode.Checked != e.Node.Checked) childcheck=false;
                    }
                    if (childcheck) e.Node.Parent.Checked = e.Node.Checked;
                }            //处理子节点,只处理一层
                if (e.Node.Nodes.Count> 0)
                {
                    foreach (TreeNode childnode in e.Node.Nodes)
                    {
                        childnode.Checked = e.Node.Checked;
                    }
                }
                this.treeView1.AfterSelect+=new TreeViewEventHandler(treeView1_AfterSelect);
            }
      

  7.   

    楼上用错事件了, treeView1_AfterSelect 是选中内容 ,不应该对Checked有影响
      

  8.   

    因为需要递归,两个方法独立是必要的。影响最少的事件,又优化了一下:private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck);
        CheckChildNode(e.Node);
        CheckParentNode(e.Node);
        this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
    }public void CheckChildNode(TreeNode node)
    {
        if (node.GetNodeCount(false) > 0)
        {
            foreach (TreeNode childnode in node.Nodes)
            {
                if (childnode.Checked != node.Checked)
                    childnode.Checked = node.Checked;
                if (childnode.GetNodeCount(false) > 0)
                {
                    CheckChildNode(childnode);
                }
            }
        }
    }
    public void CheckParentNode(TreeNode node)
    {
        if (node.Parent != null)
        {
            foreach (TreeNode childnode in node.Parent.Nodes)
            {
                if (childnode.Checked != node.Checked) return;
            }
            if (node.Parent.Checked != node.Checked)
                node.Parent.Checked = node.Checked;
            CheckParentNode(node.Parent);
        }
    }