在一个节点的选择上折叠TreeView的其他节点

时间:2012-07-10 04:34:17

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

我在* winform applica *上有一个 treeview 控件。在这里,我想做的是: 折叠其关卡中的所有其他节点,仅花费选定的节点。 例如,假设场景: - 所有主题   +计算机科学   +数学

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

当我选择计算机科学时,应该折叠数学节点并扩展计算机科学节点。 怎么能实现这一目标? 建议实现这一目标。

3 个答案:

答案 0 :(得分:1)

编辑(感谢 Hans Passant )Handel AfterSelectBeforeSelect事件,并折叠其他兄弟节点。像这样:

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

答案 1 :(得分:0)

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

treeView1.SelectedNode.Collapse();

在MSDN上阅读CollapseCollapseAllExpand

答案 2 :(得分:0)

基于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;
            }
        }
    }
}