C# 在选择一个节点时折叠TreeView的其他节点

C# 在选择一个节点时折叠TreeView的其他节点,c#,winforms,visual-studio-2008,treeview,C#,Winforms,Visual Studio 2008,Treeview,我在winform应用程序上有一个树状视图控件。在这里,我想做的是: 折叠其级别的所有其他节点并仅扩展选定节点。 例如,假设场景: -所有科目 +计算机科学 +数学 根节点是“所有主题”,两个子节点是1)计算机科学和2)数学。 这两个子节点还有更多的子节点 当我选择计算机科学时,数学节点应该收拢,计算机科学节点应该展开。 如何做到这一点? 欢迎建议完成此操作。检查treeview节点的方法CollapseAll(),Expand(),和ExpandAll() treeView1.Selected

我在winform应用程序上有一个树状视图控件。在这里,我想做的是: 折叠其级别的所有其他节点并仅扩展选定节点。 例如,假设场景: -所有科目 +计算机科学 +数学

根节点是“所有主题”,两个子节点1)计算机科学和2)数学。 这两个子节点还有更多的子节点

当我选择计算机科学时,数学节点应该收拢,计算机科学节点应该展开。 如何做到这一点?
欢迎建议完成此操作。

检查treeview节点的方法
CollapseAll()
Expand()
,和
ExpandAll()

treeView1.SelectedNode.Collapse();

阅读,然后在MSDN上检查treeview节点的方法
CollapseAll()
CollapseAll()
Expand()
、和
ExpandAll()

treeView1.SelectedNode.Collapse();
阅读,并在MSDN上编辑(感谢Hans Passant)Handel
AfterSelect
BeforeSelect
事件,并折叠其他同级节点。像这样:

private void TreeViewAfterSelect(object sender, TreeViewCancelEventArgs e)
{
    foreach (TreeNode node in e.Node.Parent.Nodes)
    {
        if(node != e.Node)
            node.Collapse();
    }
}
编辑(感谢Hans Passant)Handel
AfterSelect
beforesect
事件,并折叠其他同级节点。像这样:

private void TreeViewAfterSelect(object sender, TreeViewCancelEventArgs e)
{
    foreach (TreeNode node in e.Node.Parent.Nodes)
    {
        if(node != e.Node)
            node.Collapse();
    }
}

基于Ria的解决方案,我们可以使用递归折叠兄弟节点和每个兄弟节点的子节点。WPF的以下工作:

    private void CollapseAll(ItemsControl Items, bool Collapse)
    {
        foreach (object obj in Items.Items)
        {
            ItemsControl ChildControl = Items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl;
            if (ChildControl != null)
            {
                CollapseAll(ChildControl, Collapse);
            }
            TreeViewItem Item = ChildControl as TreeViewItem;
            if (Item != null) Item.IsExpanded = false;
        }
    }

    private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        TreeViewItem CurrentItem = (TreeViewItem)treeView1.SelectedItem;
        if (CurrentItem == null) return;
        if (!(CurrentItem.Parent is TreeViewItem)) return;
        TreeViewItem Parent = (TreeViewItem)CurrentItem.Parent;
        if (Parent == null) return;
        foreach (TreeViewItem TreeViewItem in Parent.Items)
        {
            if (TreeViewItem != CurrentItem)
            {
                CollapseAll(TreeViewItem, true);
                TreeViewItem.IsExpanded = false;
            }
        }
    }
}
private void CollapseAll(ItemsControl Items,bool CollapseAll)
{
foreach(Items.Items中的对象obj)
{
ItemsControl子控件=Items.ItemContainerGenerator.ContainerFromItem(obj)作为ItemsControl;
if(ChildControl!=null)
{
CollapseAll(儿童控制,塌陷);
}
TreeView项目=作为TreeView项目的ChildControl;
如果(Item!=null)Item.IsExpanded=false;
}
}
私有void树eview1_SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
TreeViewItem CurrentItem=(TreeViewItem)TreeViewW1.SelectedItem;
如果(CurrentItem==null)返回;
如果(!(CurrentItem.Parent为TreeViewItem))返回;
TreeViewItem父项=(TreeViewItem)CurrentItem.Parent;
if(Parent==null)返回;
foreach(父项目中的TreeView项目TreeView项目)
{
如果(TreeViewItem!=CurrentItem)
{
CollapseAll(TreeViewItem,真);
TreeViewItem.IsExpanded=false;
}
}
}
}

基于Ria的解决方案,我们可以使用递归折叠兄弟节点和每个兄弟节点的子节点。WPF的以下工作:

    private void CollapseAll(ItemsControl Items, bool Collapse)
    {
        foreach (object obj in Items.Items)
        {
            ItemsControl ChildControl = Items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl;
            if (ChildControl != null)
            {
                CollapseAll(ChildControl, Collapse);
            }
            TreeViewItem Item = ChildControl as TreeViewItem;
            if (Item != null) Item.IsExpanded = false;
        }
    }

    private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        TreeViewItem CurrentItem = (TreeViewItem)treeView1.SelectedItem;
        if (CurrentItem == null) return;
        if (!(CurrentItem.Parent is TreeViewItem)) return;
        TreeViewItem Parent = (TreeViewItem)CurrentItem.Parent;
        if (Parent == null) return;
        foreach (TreeViewItem TreeViewItem in Parent.Items)
        {
            if (TreeViewItem != CurrentItem)
            {
                CollapseAll(TreeViewItem, true);
                TreeViewItem.IsExpanded = false;
            }
        }
    }
}
private void CollapseAll(ItemsControl Items,bool CollapseAll)
{
foreach(Items.Items中的对象obj)
{
ItemsControl子控件=Items.ItemContainerGenerator.ContainerFromItem(obj)作为ItemsControl;
if(ChildControl!=null)
{
CollapseAll(儿童控制,塌陷);
}
TreeView项目=作为TreeView项目的ChildControl;
如果(Item!=null)Item.IsExpanded=false;
}
}
私有void树eview1_SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
TreeViewItem CurrentItem=(TreeViewItem)TreeViewW1.SelectedItem;
如果(CurrentItem==null)返回;
如果(!(CurrentItem.Parent为TreeViewItem))返回;
TreeViewItem父项=(TreeViewItem)CurrentItem.Parent;
if(Parent==null)返回;
foreach(父项目中的TreeView项目TreeView项目)
{
如果(TreeViewItem!=CurrentItem)
{
CollapseAll(TreeViewItem,真);
TreeViewItem.IsExpanded=false;
}
}
}
}

不恢复旧线程,但这只会折叠同级节点。如果您想同时折叠同级节点和每个同级节点的子节点,我在下面添加了我自己的答案,它使用递归。不是要恢复旧线程,而是只折叠同级节点。如果您想同时折叠同级节点和每个同级节点的子节点,我在下面添加了我自己的答案,它使用递归。