Как свернуть все узлы, кроме выбранной ветви?

#c# #winforms

#c# #winforms

Вопрос:

Как я могу свернуть все узлы, кроме выбранной в данный момент ветки?

Вот что у меня есть

     private void treeview1_AfterSelect(object sender, TreeViewEventArgs e)
    {
        TreeNode node = e.Node;
        treeView1.CollapseAll();
        while (node.Parent != null)
        {
            node.Expand();
            node = node.Parent;
        }
    }
  

Корневой узел разрушается независимо. Если я расширяюсь, я вижу, что дочерний элемент иногда расширяется.
В идеальном мире, если я выбираю узел, он немедленно расширяется, и любой узел за пределами этой ветви сворачивается. С тем, как я пытаюсь это сделать сейчас, я не смог бы использовать e.Node.Развернуть(); в начале либо.

Ответ №1:

Если вам нужно развернуть только одну ветвь того же уровня, обработайте TreeView.AfterExpand событие, чтобы свернуть соседние узлы:

 private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
{
    // If you need to exclude the root nodes, return if the e.Node.Parent == null.
    var nodes = e.Node.Parent == null ? treeView1.Nodes : e.Node.Parent.Nodes;

    if (nodes.Count > 1)
        foreach (var tn in nodes
            .Cast<TreeNode>()
            .Where(n => n != e.Node amp;amp; n.IsExpanded))
            tn.Collapse();
}
  

Чтобы автоматически развернуть узел (особенно, когда TreeView.ShowPlusMinus свойство отключено), обработайте TreeView.AfterSelect событие для расширения выбранного узла:

 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    if (e.Node.Nodes.Count > 0 amp;amp; !e.Node.IsExpanded) e.Node.Expand();
}
  

Комментарии:

1. Спасибо, это именно то, что я искал.