C# winform中treeview 的checkbox勾选

时间:2022-02-06 08:52:20
即 我勾选父节点,其子节点全部自动勾选,取消父节点勾选其子节点也全部取消勾选,如果只选子节点全选则其父节点自动勾选 ,如果子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)[/color]
最好能有例子代码  
现在我就需要“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”的代码,谢谢

19 个解决方案

#1


顶顶顶顶顶

#2


拿分走人

#3


(0x2000)
(1) 
(0)
(6) 
(0xc0)
(0xe0
 (0x20)
  (6)
   (6)
   COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf

#4


是这样了:
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
   foreach(TreeNode tr in TreeNode1.Nodes)
   {
     tr.Selected=true;
   }
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
  TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)

#5


  private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse)
            {
                if (e.Node.Checked)
                {
                    //取消节点选中状态之后,取消所有父节点的选中状态
                    setChildNodeCheckedState(e.Node, true);
                }
                else
                {
                    //取消节点选中状态之后,取消所有父节点的选中状态
                    setChildNodeCheckedState(e.Node, false);
                    //如果节点存在父节点,取消父节点的选中状态
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, false);
                    }
                }
            }
        }
        //取消节点选中状态之后,取消所有父节点的选中状态
        private void setParentNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNode parentNode = currNode.Parent;

            parentNode.Checked = state;
            if (currNode.Parent.Parent != null)
            {
                setParentNodeCheckedState(currNode.Parent, state);
            }
        }
        //选中节点之后,选中节点的所有子节点
        private void setChildNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNodeCollection nodes = currNode.Nodes;
            if (nodes.Count > 0)
                foreach (TreeNode tn in nodes)
                {
                    tn.Checked = state;
                    setChildNodeCheckedState(tn, state);
                }
        }

#6


谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”

#7


5楼的setParentNodeCheckedState方法即可实现你的要求啊,lz仔细看啊。

#8


回帖加分——用来提问

#9


我试过了,但是不行

#10


  /// <summary>
        /// 设置所有父节点的选中状态
        /// </summary>
        /// <param name="currNode"></param>
        /// <param name="state"></param>
        private void setParentNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNode parentNode = currNode.Parent;

            parentNode.Checked = state;
            if (currNode.Parent.Parent != null)
            {
                setParentNodeCheckedState(currNode.Parent, state);
            }
        }

        /// <summary>
        /// 设置所有子节点的选中状态
        /// </summary>
        /// <param name="currNode"></param>
        /// <param name="state"></param>
        private void setChildNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNodeCollection nodes = currNode.Nodes;
            if (nodes.Count > 0)
                foreach (TreeNode tn in nodes)
                {
                    tn.Checked = state;
                    setChildNodeCheckedState(tn, state);
                }
        }


      /// <summary>
        /// 控制正选,反选,以及选中子节点的时候选中父节点,取消父节点则取消所有子节点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvModules_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse)
            {
                if (e.Node.Checked)
                {
                    //节点选中后,选中所有子节点
                    setChildNodeCheckedState(e.Node, true);

                    //节点选中之后,选中所有父节点
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, true);
                    }
                }
                else
                {
                    //取消节点选中后,取消所有子节点的选中状态
                    setChildNodeCheckedState(e.Node, false);
                }
            }
        }

#11


引用 6 楼 dongxiao0517 的回复:
谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”

这个没搞过
不过感觉如果直接更改系统主题倒是来得简单了
那样的话复选框就能是填充的方块了

#12


TreeView 加载的时候判断父节点是否为选中状态,如果没选中就判断其子节点是否为全部选中,,,
如果没有全部选中就改变此节点的颜色

#13


楼上很多人解决了   我路过........

#14


if()//子节点没全部选中
{
TreeNode f = new TreeNode();
 f.Parent.BackColor = Color.Red;
}

#15


哎,小方块还是没有显现出来 

#16


treeView1.CheckBoxes = true;
treeView1.AfterCheck += this.treeView1_AfterCheck;
treeView1.ExpandAll();
 private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            this.CheckSubNodes(e.Node);           
        }


 private void CheckSubNodes(TreeNode checkRoot)
        {
            //遍历所有直接子节点,并调整其Check状态为父节点的状态
            foreach (TreeNode tn in checkRoot.Nodes)
            {
                //注意这里本身并没有直接递归调用CheckSubNodes,但是由于这个操作导致了其子节点的状态变化,产生了AfterCheck事件。
                tn.Checked = checkRoot.Checked;
            }
        }

#18


不好意思,发错地方了,呵呵。。。

#19


16楼的报错了 说是出现了无限递归

#1


顶顶顶顶顶

#2


拿分走人

#3


(0x2000)
(1) 
(0)
(6) 
(0xc0)
(0xe0
 (0x20)
  (6)
   (6)
   COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf

#4


是这样了:
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
   foreach(TreeNode tr in TreeNode1.Nodes)
   {
     tr.Selected=true;
   }
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
  TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)

#5


  private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse)
            {
                if (e.Node.Checked)
                {
                    //取消节点选中状态之后,取消所有父节点的选中状态
                    setChildNodeCheckedState(e.Node, true);
                }
                else
                {
                    //取消节点选中状态之后,取消所有父节点的选中状态
                    setChildNodeCheckedState(e.Node, false);
                    //如果节点存在父节点,取消父节点的选中状态
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, false);
                    }
                }
            }
        }
        //取消节点选中状态之后,取消所有父节点的选中状态
        private void setParentNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNode parentNode = currNode.Parent;

            parentNode.Checked = state;
            if (currNode.Parent.Parent != null)
            {
                setParentNodeCheckedState(currNode.Parent, state);
            }
        }
        //选中节点之后,选中节点的所有子节点
        private void setChildNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNodeCollection nodes = currNode.Nodes;
            if (nodes.Count > 0)
                foreach (TreeNode tn in nodes)
                {
                    tn.Checked = state;
                    setChildNodeCheckedState(tn, state);
                }
        }

#6


谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”

#7


5楼的setParentNodeCheckedState方法即可实现你的要求啊,lz仔细看啊。

#8


回帖加分——用来提问

#9


我试过了,但是不行

#10


  /// <summary>
        /// 设置所有父节点的选中状态
        /// </summary>
        /// <param name="currNode"></param>
        /// <param name="state"></param>
        private void setParentNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNode parentNode = currNode.Parent;

            parentNode.Checked = state;
            if (currNode.Parent.Parent != null)
            {
                setParentNodeCheckedState(currNode.Parent, state);
            }
        }

        /// <summary>
        /// 设置所有子节点的选中状态
        /// </summary>
        /// <param name="currNode"></param>
        /// <param name="state"></param>
        private void setChildNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNodeCollection nodes = currNode.Nodes;
            if (nodes.Count > 0)
                foreach (TreeNode tn in nodes)
                {
                    tn.Checked = state;
                    setChildNodeCheckedState(tn, state);
                }
        }


      /// <summary>
        /// 控制正选,反选,以及选中子节点的时候选中父节点,取消父节点则取消所有子节点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvModules_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse)
            {
                if (e.Node.Checked)
                {
                    //节点选中后,选中所有子节点
                    setChildNodeCheckedState(e.Node, true);

                    //节点选中之后,选中所有父节点
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, true);
                    }
                }
                else
                {
                    //取消节点选中后,取消所有子节点的选中状态
                    setChildNodeCheckedState(e.Node, false);
                }
            }
        }

#11


引用 6 楼 dongxiao0517 的回复:
谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”

这个没搞过
不过感觉如果直接更改系统主题倒是来得简单了
那样的话复选框就能是填充的方块了

#12


TreeView 加载的时候判断父节点是否为选中状态,如果没选中就判断其子节点是否为全部选中,,,
如果没有全部选中就改变此节点的颜色

#13


楼上很多人解决了   我路过........

#14


if()//子节点没全部选中
{
TreeNode f = new TreeNode();
 f.Parent.BackColor = Color.Red;
}

#15


哎,小方块还是没有显现出来 

#16


treeView1.CheckBoxes = true;
treeView1.AfterCheck += this.treeView1_AfterCheck;
treeView1.ExpandAll();
 private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            this.CheckSubNodes(e.Node);           
        }


 private void CheckSubNodes(TreeNode checkRoot)
        {
            //遍历所有直接子节点,并调整其Check状态为父节点的状态
            foreach (TreeNode tn in checkRoot.Nodes)
            {
                //注意这里本身并没有直接递归调用CheckSubNodes,但是由于这个操作导致了其子节点的状态变化,产生了AfterCheck事件。
                tn.Checked = checkRoot.Checked;
            }
        }

#17


#18


不好意思,发错地方了,呵呵。。。

#19


16楼的报错了 说是出现了无限递归

#20