[C#]Winform记录TreeView的checked_change事件

对treeView操作时发现一个有趣的事情。

想要实现点击treeView某一个节点,或者点击该节点的复选框时,将其所有子节点设为与该节点相同的check状态。
1.如果是点击,则触发MouseClick()事件,此时需要遍历该节点的所有子节点,递归设置所有子节点的check状态。

        public void SetChildCheckState(TreeNode tnParent,bool b)
        {
            for(int i = 0; i < tnParent.Nodes.Count; i++)
            {
                tnParent.Nodes[i].Checked = b;
                SetChildCheckState(tnParent.Nodes[i],b);
            }
        }
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode tmp = e.Node;
            if (tmp.Checked)
                SetChildCheckState(tmp, false);
            else
                SetChildCheckState(tmp, true);
        }

2.如果是选择复选框,则只需要遍历其子节点改变状态即可

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            TreeNode tmp = e.Node;
            foreach (TreeNode t in tmp.Nodes)
            {
                t.Checked = tmp.Checked;
            }
        }

这是因为,选中复选框,在改变其子节点的check状态时,又一次触发了treeView1_AfterCheck事件,相当于自身在执行递归,所以不用再手动写。

而且,如果两个方法一起使用,treeView1_NodeMouseClick会屏蔽treeView1_AfterCheck。因为点击复选框会优先触发treeView1_AfterCheck,treeView1_AfterCheck执行完后再次调用treeView1_NodeMouseClick。所以两个事件只能保留一个。

发布者

VC-Robot

游戏爱好者,动漫迷,C++修炼中,编程菜鸟,随性

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据