如何仅展开树形视图的一级子项

10

我希望默认显示树形视图的所有一级子节点, 然后在点击时展开它们的所有子节点。


1
迭代节点并调用它们的Expand()方法。“那些点击的”太模糊了。 - Hans Passant
6个回答

14

尝试:

foreach (TreeNode tn in treeView1.Nodes) {
  tn.Expand();
}

在运行时添加节点时,您只需检查级别并展开(如果需要):

private void ShouldAutoExpand(TreeNode tn) {
  if (tn.Level == 0)
    tn.Expand();
}

没有可以挂钩以自动检查的NodeAdded事件。您必须自己确定节点是否应该“默认”展开。

更新:

根据您的评论,似乎您希望所有0级节点都展开,但在展开它们时展开所有1级子节点。

尝试使用以下代码订阅BeforeExpand事件:

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
  treeView1.BeforeExpand -= treeView1_BeforeExpand;
  if (e.Node.Level == 1) {
    e.Node.ExpandAll();
  }
  treeView1.BeforeExpand += treeView1_BeforeExpand;
}

第一部分显示了我想要的一级子项。但是,当我点击其中任何一个时,它们的后代子项并没有完全展开。 - zsharp
@zsharp 更新了代码。听起来你基本上想要所有节点自动展开,除了一级节点。是这样吗? - LarsTech
那就是了,我之前试过使用onmouseclick,但是很混乱。谢谢。 - zsharp

1
private TreeNode ExpandUptoLevel(TreeNode tn,int level)
    {
        if (level != 0)
        {
             level --;
             tn.Nodes[0].Expand();
             return ExpandUptoLevel(tn.FirstNode, level);
        }                               
        return tn;  
     }

1

你可以尝试这样做... 你需要改变示例以适应你自己的代码,因为你没有粘贴任何你拥有或尝试过的代码

private void addChildNode_Click(object sender, EventArgs e) 
{
  var childNode = textBox1.Text.Trim();
  if (!string.IsNullOrEmpty(childNode)) {
    TreeNode parentNode = treeView2.SelectedNode ?? treeView2.Nodes[0];
    if (parentNode != null) {
      parentNode.Nodes.Add(childNode);
      treeView2.ExpandAll();
    }
  }
}

1
如果你想要一个递归的,可以试试这个:
void expAll(TreeNode node)
{
   node.Expand();
   foreach(TreeNode i in node.Nodes)
   {
       expAll(i);
   }
}

0
要将树中的所有节点扩展到一个级别,上面的代码是无法工作的。只需添加一个检查来读取并比较实际节点级别与您希望扩展到的级别即可。以下是代码片段。
    private void ExpandUptoLevel(TreeNode tn, int level)
    {
        if (level >= tn.Level)
        { 
            tn.Expand();
            foreach (TreeNode i in tn.Nodes)
            {
                ExpandUptoLevel(i,level);
            }
        }
    }

回复Ravindra Sinare的帖子- 不是回复上面的帖子。 - Peter Bauer

0

只打开第一个节点:

for (int i = 0;  i< treeView1.Nodes.Count; i++)
        {
            treeView1.Nodes[i].Expand();
        }

虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。请尽量不要在代码中添加过多的解释性注释,这会降低代码和解释的可读性! - kayess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接