C# Treeview,如何只检查一个根行?

C# Treeview, how to keep only one rootline checked?

使用 WinForms,桌面应用程序。

选中节点时,我必须取消选中不共享同一根的节点。因此,如果我有 5 个根,有多个 childs(深树)并且我检查了根 1 的 child 节点,我需要取消选中根 2-5 和所有 childs .

我真的必须遍历所有节点才能取消选中它们吗?这变得很重,如果我有 10 个根,每个根有 30+ child?

编辑: 所以,我的用例是,我需要能够 select 所有节点,但只有一个根节点。对于 root,我指的是第一个节点和它的兄弟节点。因此,如果我检查位于其他基本根节点中的节点,则所有其他根和 child 都不会被选中。一次只能激活一个根。

    1. child1
    2. child2
  1. root2
    1. child3
    2. child4

因此选中 child4,取消选中 root、child1 和 child2

当您使用递归时,它永远不会 "heavy",递归是访问树节点的自然方式。您只需迭代选中节点的兄弟节点并递归访问它们的子节点并取消选中它们。像这样:

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) {
    if (e.Node.Checked) {
        for (var node = e.Node.PrevNode; node != null; node = node.PrevNode) uncheckTree(node);
        for (var node = e.Node.NextNode; node != null; node = node.NextNode) uncheckTree(node);
    }
}

private void uncheckTree(TreeNode node) {
    node.Checked = false;
    foreach (TreeNode child in node.Nodes) uncheckTree(child);
}