【问题标题】:Delete empty root node in treeView删除treeView中的空根节点
【发布时间】:2013-07-19 14:19:30
【问题描述】:

假设我有 3 个类别的树,每个类别都有 3 个子节点。当所有子节点都被删除时,我想删除根节点。我尝试过这样的事情:

        TreeNode current = treeView1.SelectedNode;
        TreeNode parent  = treeView1.SelectedNode.Parent;

        if (parent.Nodes.Count == 0)
        {
            parent.Nodes.Remove(current);
        }

我把它放在 Form1_Load 中。不幸的是,当所有子节点都消失时,什么也没有发生。这段代码正确吗?或者也许我放错了地方,我应该把它放在别的地方?

编辑:我的树看起来像这样:

早上

  • 刷牙
  • 喝咖啡

下午

  • 晚餐
  • 电视

夜晚

  • 睡觉

所以如果我决定删除“睡眠”,我也想删除“夜晚”。但是如果我决定删除“TV”,我想保留“Dinner”和“Afternoon”。

【问题讨论】:

  • 你要从孩子父母。假设没有抛出NullReferenceExceptionparent.Nodes.Count 将始终至少为 1。

标签: c# winforms visual-studio-2010 treeview


【解决方案1】:

试试这个:

if (treeView1.SelectedNode != null)
{
    if (treeView1.SelectedNode.Parent == null) treeView1.SelectedNode.Remove();
    else if (treeView1.SelectedNode.Parent.Nodes.Count == 1) treeView1.SelectedNode.Parent.Remove();
    else treeView1.SelectedNode.Remove();
}

【讨论】:

    【解决方案2】:

    如果父节点为空,那么你就知道你在一个根节点上。因此需要直接从 TreeView 的 Nodes 集合中删除该节点。否则,您可以从父节点中删除选定的节点。甚至没有理由查看节点数。

    现在,您还需要检查当前节点是否也不为空;因为在树中不选择任何节点是完全合理的。

    TreeNode current = treeView1.SelectedNode;
    if(current == null)
        return;
    
    TreeNode parent  = treeView1.SelectedNode.Parent;
    if (parent == null)
    {
        treeView1.Nodes.Remove(current);
    }
    else
    {
        parent.Nodes.Remove(current);
    }
    

    【讨论】:

    • 但是如果我删除最后一个子节点后没有选择根节点怎么办?这可以在最后一个子节点被删除后立即删除吗?另外我不太明白这个 sn-p - 无论 parent 是否为 null,都会删除某些内容?
    • treeview1.SelectedNode 如果没有选择树中的任何内容,则可能返回 null。此外,如果 SelectedNode 是根节点,则 treeview1.SelectedNode.Parent 将返回 null。如果您选择了根节点,您希望将其从树中移除;否则,你想从它的父节点集合中删除它。
    • 此代码无法按 OP 的要求工作。如果 parent != null,它可以包含 1、2、3 ... 子节点,但您只需在所有情况下删除 current node。而在父节点仅包含 1 个子节点的情况下,应将其与唯一的子节点一起删除。
    • 你是对的。原始帖子对于确切的行为不是很清楚。操作的编辑很好地阐明了这一点。
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多