C# 如何在选择或取消选择父节点时自动选择或取消选择所有子节点?

C# 如何在选择或取消选择父节点时自动选择或取消选择所有子节点?,c#,winforms,C#,Winforms,我的Windows窗体应用程序中有一个带有复选框的树状视图控件。如何在选择或取消选择父节点时自动选择或取消选择所有子节点?如果我没有弄错,事件文档中的示例代码完全符合您的要求。使用treeview的AfterCheck事件编码treeview中的子节点应发生的情况 private void HandleOnTreeViewAfterCheck(Object sender, TreeViewEventArgs e) { CheckTreeViewNod

我的Windows窗体应用程序中有一个带有复选框的树状视图控件。如何在选择或取消选择父节点时自动选择或取消选择所有子节点?

如果我没有弄错,事件文档中的示例代码完全符合您的要求。

使用treeview的AfterCheck事件编码treeview中的子节点应发生的情况

    private void HandleOnTreeViewAfterCheck(Object sender,
       TreeViewEventArgs e)
    {
        CheckTreeViewNode(e.Node, e.Node.Checked);
    }

    private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
    {
        foreach (TreeNode item in node.Nodes)
        {
            item.Checked = isChecked;

            if (item.Nodes.Count > 0)
            {
                this.CheckTreeViewNode(item, isChecked);
            }
        }
    }

将树状视图节点的相同状态也传递给其子节点,并将其选中属性设置为树状视图节点的相同状态。

请尝试此代码,此代码用于检查父节点,并在单击子节点时取消选中父节点

If Not TreeView1.Nodes(e.Node.Text) Is Nothing Then
    For Each node As TreeNode In TreeView1.Nodes(e.Node.Text).Nodes
            If node.Parent.Checked = True Then
                node.Checked = True
            End If
            If node.Parent.Checked = False Then
                node.Checked = False
            End If

        Next
    End If
    private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
    {
        foreach (TreeNode item in node.Nodes)
        {
            item.Checked = isChecked;

            if (item.Nodes.Count > 0)
            {
                this.CheckTreeViewNode(item, isChecked);
            }
        }

        if (isChecked && node.Parent != null)
        {
            treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
            node.Parent.Checked = true;
            treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
        }


        if (!isChecked && node.Parent != null)
        {
            bool unchk = true;
            treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
            foreach (TreeNode item in node.Parent.Nodes)
            {
                if (item.Checked)
                {
                    unchk = false;
                    break;
                }
            }
            if (unchk)
                node.Parent.Checked = false;

            treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
        }

    }

请在下面找到工作代码。我在我的应用程序中使用这个。希望这能解决问题

private void tree_Documents_AfterCheck(object sender, TreeViewEventArgs e)
    {
        TreeNode checkedNode = e.Node;
        foreach (TreeNode node in checkedNode.Nodes)
        {
            node.Checked = checkedNode.Checked;
        }
    }

这个简单的代码适合我

private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
        try {
            e.Node.TreeView.BeginUpdate();
            if (e.Node.Nodes.Count > 0) {
                var parentNode = e.Node;
                var nodes = e.Node.Nodes;
                CheckedOrUnCheckedNodes(parentNode, nodes);
            }
        } finally {
            e.Node.TreeView.EndUpdate();
        }
    }

private void CheckedOrUnCheckedNodes(TreeNode parentNode, TreeNodeCollection nodes) {
        if (nodes.Count > 0) {
            foreach (TreeNode node in nodes) {
                node.Checked = parentNode.Checked;
                CheckedOrUnCheckedNodes(parentNode, node.Nodes);
            }
        }
    }

您可以创建一个方法并从treeviewbeforecheck事件调用它,这样它将检查所有树节点。上面的帖子帮助您或您卡住了somewhere@TechGiant:如何创建treeviewbeforecheck事件?foreach循环是否递归地遍历树?e.Node.Nodes在分支上行走吗?不,只有一层。假设他的req只有一个级别。我添加了执行递归检查的代码。感谢您指出这一点。@VijaySirigiri此逻辑有点冒险,因为当您检查foreach中的子项时,也会触发他的AfterCheck事件,因此级联效果变得不可预测。我建议改进上述代码,在调用CheckTreeViewNode方法:ife.Action!之前执行此检查如何在c.net中创建AfterCheck事件?只需右键单击表单中的树视图,转到属性。在该对话框中,选择事件选项卡。您将在此处找到与此控件关联的事件列表。双击AfterCheck事件,它会为您生成。@Sourav,您的意思是,因为我没有复制文档中的代码?它可以在我提供的链接中找到。也就是说,你是对的,我可能不应该回答这个问题,但因为缺乏研究,我投票决定结束这个问题。2011年我还在学习诀窍……请在代码中添加一些注释并解释!这不会选中/取消选中checkedNode的子节点。
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (e.Node.Nodes.Count != 0)
    {
        if (e.Node.Checked)
        {
            CheckAllChildNodes1(e.Node);
        }
        else
        {
            UncheckChildNodes1(e.Node);
        }
    }
}

private void CheckAllChildNodes1(TreeNode treeNodeAdv)
{
    foreach (TreeNode nd in treeNodeAdv.Nodes)
    {
        nd.Checked = treeNodeAdv.Checked;
    }
}

private void UncheckChildNodes1(TreeNode treeNodeAdv)
{
    foreach (TreeNode nd in treeNodeAdv.Nodes)
    {
        nd.Checked = treeNodeAdv.Checked;
    }
}
private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
        try {
            e.Node.TreeView.BeginUpdate();
            if (e.Node.Nodes.Count > 0) {
                var parentNode = e.Node;
                var nodes = e.Node.Nodes;
                CheckedOrUnCheckedNodes(parentNode, nodes);
            }
        } finally {
            e.Node.TreeView.EndUpdate();
        }
    }

private void CheckedOrUnCheckedNodes(TreeNode parentNode, TreeNodeCollection nodes) {
        if (nodes.Count > 0) {
            foreach (TreeNode node in nodes) {
                node.Checked = parentNode.Checked;
                CheckedOrUnCheckedNodes(parentNode, node.Nodes);
            }
        }
    }
    private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
    {
        foreach (TreeNode node in treeNode.Nodes)
        {
            node.Checked = nodeChecked;
            if (node.Nodes.Count > 0)
            {
                this.CheckAllChildNodes(node, nodeChecked);
            }
        }
    }
    private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
    {
        if (e.Action != TreeViewAction.Unknown)
        {
            if (e.Node.Nodes.Count > 0)
            {
                if (!e.Node.Checked)
                {
                    this.CheckAllChildNodes(e.Node, e.Node.Checked);
                }
            }
        }

        if (e.Node.Parent != null)
        {
            TreeNode n = e.Node;
            while (n.Parent != null)
            {
                if (n.Checked)
                {
                    n.Parent.Checked = true;
                }
                n = n.Parent;
            }
        }

    }