我在 * winform应用程序 *tion上有一个树视图控件。在这里,我想要做的是: 折叠他级别的所有其他节点并仅消耗选定的节点。例如,假设场景: - 所有科目 + 计算机科学 + 数学
根节点是“所有科目”,两个子节点是1)计算机科学和2)数学。这两个子节点还有更多的子节点。
当我选择计算机科学时,数学节点应该被折叠,计算机科学节点应该被展开。 如何实现?欢迎提出实现这一目标的建议。
我在 * winform应用程序 *tion上有一个树视图控件。在这里,我想要做的是: 折叠他级别的所有其他节点并仅消耗选定的节点。例如,假设场景: - 所有科目 + 计算机科学 + 数学
根节点是“所有科目”,两个子节点是1)计算机科学和2)数学。这两个子节点还有更多的子节点。
当我选择计算机科学时,数学节点应该被折叠,计算机科学节点应该被展开。 如何实现?欢迎提出实现这一目标的建议。
编辑(感谢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();
}
}
检查树视图节点的方法Collapse()
、CollapseAll()
、Expand()
和ExpandAll()
。
treeView1.SelectedNode.Collapse();
阅读MSDN 上的Collapse、CollapseAll和Expand。
基于 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;
}
}
}
}