获取可以通过滚动显示的所有TreeNodes

时间:2018-04-17 15:05:07

标签: c# .net winforms

考虑一个拥有许多节点的TreeView,这样在视口中并不是所有节点都可见。你必须滚动才能看到更多。

我正在寻找一些属性,它可以通过向上/向下滚动显示所有可以显示的节点,即所有未隐藏在折叠父级内的节点,无论它们是否在视口中看到时刻。

我知道IsVisible,它为我提供了一个TreeNode现在是否在视图中可见的信息。但是对于我必须滚动查看的节点,该属性将返回false。

是否有合适的财产或其他方式来做这件事?

编辑: 我正在使用Winforms

2 个答案:

答案 0 :(得分:0)

听起来你想要所有顶级节点以及扩展其父节点的任何子节点。

以下是使用递归函数的快速实现:

public IEnumerable<TreeNode> GetVisibleNodes(TreeView view)
{
    List<TreeNode> nodes = new List<TreeNode>();
    foreach (TreeNode node in view.Nodes)
    {                
        nodes.AddRange(TraverseNode(node));
    }
    return nodes;
}

private IEnumerable<TreeNode> TraverseNode(TreeNode node)
{
    List<TreeNode> visibleNodes = new List<TreeNode>();
    visibleNodes.Add(node);
    if (node.IsExpanded)
    {
        foreach (TreeNode childNode in node.Nodes)
        {
            visibleNodes.AddRange(TraverseNode(childNode));
        }
    }
    return visibleNodes;
}

用法:

var nodes = GetVisibleNodes(someTreeView);

答案 1 :(得分:0)

这是我最终做的事情。出于性能原因,visibleNodes在方法外声明。我将这个方法称为根节点作为参数。

    private void GetVisibleNodes(TreeNode node)
    {
        visibleNodes.Add(node);
        if (node.IsExpanded)
        {
            foreach (TreeNode childNode in node.Nodes)
            {
                GetVisibleNodes(childNode);
            }
        }
    }