在TreeView中的level有4级~
我需要在点击3级目录的CheckBoxes的同时修改他的父级目录(包括父级目录的父级目录...直到顶级目录)和子级目录(包括该目录的所有子级)
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
   if (e.Node.Checked == true && e.Node.Level == 1)
   {
      e.Node.Parent.Checked = true;
      return;
   }
      if (e.Node.Checked == true && e.Node.Level == 2)
      {
         e.Node.Parent.Checked = true;
         return;
      }
      if (e.Node.Checked == true && e.Node.Level == 3)
      {
         e.Node.Parent.Checked = true;
         return;
      }
      if (e.Node.Checked == false)
      {
         if (e.Node.Nodes.Count > 0)
         {
             foreach (TreeNode node in e.Node.Nodes)
             {
                node.Checked = e.Node.Checked;
             }
          }
      }
}以上代码只能作到点击子级目录的CheckBoxes时同时修改他的父级目录请问我该如何改????????

解决方案 »

  1.   

    递归,更改parent的状态,更改parent.parent的状态,更改。。知道根接点
      

  2.   

    第二种,
    第一种傻办法。需要你确定有几级。比方说你说的三级。那么接下来
    Node这个是你当前点击的节点
    Node.Checked=true;
    Node.Parent.Checked=true;
    Node.Parent.Parent.Check=true;...
    foreach(TreeNode n in Node.Nodes)
      n.checked=true;第二种,用递归这样无论你有几级都可以实现
    代码一会儿发上来
      

  3.   

            /// <summary>
            /// 当某个节点状态发生变化时,改变其子节点与父节点状态        /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void tview_AfterCheck(object sender, TreeViewEventArgs e)
            {
                TreeNode node = e.Node;
                //只执行用户操作而产生的事件
                if (e.Action != TreeViewAction.Unknown)
                {
                    //当node有子节点的时候,设置子节点状态与node状态相同
                    if (node.Nodes != null)
                    {
                        SetAllChildNodesCheckedState(node);
                    }                //当node有父节点时
                    while (node.Parent != null)
                    {
                        //如果node状态为真,则父节点状态为真
                        if (node.Checked)
                        {
                            node.Parent.Checked = true;
                        }
                        else
                        {
                            //看兄弟节点状态是否都为假,如果是设置父节点状态为假
                            bool bolAllFalse = true;
                            foreach (TreeNode cnode in node.Parent.Nodes)
                            {
                                if (cnode.Checked)
                                {
                                    bolAllFalse = false;
                                    break;
                                }
                            }
                            if (bolAllFalse)
                            {
                                node.Parent.Checked = false;
                            }
                        }
                        node = node.Parent;
                    }            }        }        /// <summary>
            /// 设置说有子几点为node状态
            /// </summary>
            /// <param name="node"></param>
            private void SetAllChildNodesCheckedState(TreeNode node)
            {
                foreach (TreeNode cnode in node.Nodes)
                {
                    cnode.Checked = node.Checked;
                    SetAllChildNodesCheckedState(cnode);
                }
            }
      

  4.   

    我在资源里面有一个三种状态的树形控件,你可以看看,满足你的要求。
    http://download.csdn.net/source/315730
      

  5.   

            private void Form1_Load(object sender, EventArgs e)
            {
                InitTreeView();
            }        /// <summary>
            /// 初始化树型,一共5层
            /// </summary>
            private void InitTreeView()
            {
                treeView1.Nodes.Clear();
                for (int i = 1; i < 6; i++)
                {
                    TreeNode n = new TreeNode("第 " + i.ToString());
                    treeView1.Nodes.Add(n);
                    AddNode(n, 0);
                }
            }
            private void AddNode(TreeNode n,int l)
            {
                if(l>5)
                    return;
                l++;
                for (int j = 0; j < 5; j++)
                {
                    TreeNode n1 = new TreeNode(j.ToString());
                    n.Nodes.Add(n1);
                    AddNode(n1, l);
                }
            }        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
                {
                    CheckParent(e.Node);
                    CheckChild(e.Node);
                }
            }        /// <summary>
            /// 递归打勾父节点
            /// </summary>
            /// <param name="n"></param>
            private void CheckParent(TreeNode n)
            {
                if (n.Parent != null)
                {
                    n.Parent.Checked = n.Checked;
                    CheckParent(n.Parent);
                }
            }
            /// <summary>
            /// 递归打勾子节点
            /// </summary>
            /// <param name="n"></param>
            private void CheckChild(TreeNode n)
            {            if (n.Nodes.Count != 0)
                {
                    foreach (TreeNode n1 in n.Nodes)
                    {
                        n1.Checked = n.Checked;
                        CheckChild(n1);
                    }
                }
                else
                    return;
            }