使用桌面应用程序的WinForms。
选中node时,我必须取消选中不共享同一根的节点。因此,如果我有5个根,有多个子(深树)并且我检查节点是根1的子节点,我需要取消选中根2-5和所有子节点。
我是否真的必须通过所有节点取消选中它们?如果我有10个根,每个都有30多个孩子,这会变得非常沉重吗?
编辑: 所以,我的用例是,我需要能够选择所有节点,但只能选择一个根节点。对于root,我指的是第一个节点和兄弟姐妹。因此,如果我检查位于其他基本根节点中的节点,则取消选中所有其他根和子节点。一次只能激活一个根。
因此检查child4,取消选中root,child1和child2
答案 0 :(得分:3)
从来没有"沉重的"当你使用递归时,访问树节点的自然方式。您只需迭代已检查节点的兄弟节点并递归以访问其子节点并取消选中它们。像这样:
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);
}