C# 在选择一个节点时折叠TreeView的其他节点
我在winform应用程序上有一个树状视图控件。在这里,我想做的是: 折叠其级别的所有其他节点并仅扩展选定节点。 例如,假设场景: -所有科目 +计算机科学 +数学 根节点是“所有主题”,两个子节点是1)计算机科学和2)数学。 这两个子节点还有更多的子节点 当我选择计算机科学时,数学节点应该收拢,计算机科学节点应该展开。 如何做到这一点?C# 在选择一个节点时折叠TreeView的其他节点,c#,winforms,visual-studio-2008,treeview,C#,Winforms,Visual Studio 2008,Treeview,我在winform应用程序上有一个树状视图控件。在这里,我想做的是: 折叠其级别的所有其他节点并仅扩展选定节点。 例如,假设场景: -所有科目 +计算机科学 +数学 根节点是“所有主题”,两个子节点是1)计算机科学和2)数学。 这两个子节点还有更多的子节点 当我选择计算机科学时,数学节点应该收拢,计算机科学节点应该展开。 如何做到这一点? 欢迎建议完成此操作。检查treeview节点的方法CollapseAll(),Expand(),和ExpandAll() treeView1.Selected
欢迎建议完成此操作。检查treeview节点的方法
CollapseAll()
,Expand()
,和ExpandAll()
treeView1.SelectedNode.Collapse();
阅读,然后在MSDN上检查treeview节点的方法
CollapseAll()
、CollapseAll()
、Expand()
、和ExpandAll()
treeView1.SelectedNode.Collapse();
阅读,并在MSDN上编辑(感谢Hans Passant)HandelAfterSelect
或BeforeSelect
事件,并折叠其他同级节点。像这样:
private void TreeViewAfterSelect(object sender, TreeViewCancelEventArgs e)
{
foreach (TreeNode node in e.Node.Parent.Nodes)
{
if(node != e.Node)
node.Collapse();
}
}
编辑(感谢Hans Passant)HandelAfterSelect
或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;
}
}
}
}
不恢复旧线程,但这只会折叠同级节点。如果您想同时折叠同级节点和每个同级节点的子节点,我在下面添加了我自己的答案,它使用递归。不是要恢复旧线程,而是只折叠同级节点。如果您想同时折叠同级节点和每个同级节点的子节点,我在下面添加了我自己的答案,它使用递归。