TreeView-遍历所有节点,首先可见

时间:2018-07-19 12:43:37

标签: c# loops recursion treeview iteration

我现在有一个精神障碍,这并不难。

我有一个应该获取TreeView中最后一个可见节点的函数。首先,我想转到第一个可见节点,然后从第二个开始,直到node.IsVisible()。

这就是我所拥有的:

public TreeNode GetLastVisibleNode()
    {
        var node = treeControl1.Nodes.Cast<TreeNode>().Where(x => x.IsVisible).FirstOrDefault();
        TreeNode retVal = node;
        while (node != null && node.IsVisible)
        {
            if (!node.IsSelected)
                retVal = node;
            node = node.NextVisibleNode;
        }
        return retVal;
    }

如您所见,当我拥有第一个可见对象(HOORAY)时,我使其迭代到最后一个可见节点,但是我获得第一个可见对象的方法是WRONG(OHHHHH!)

我注意到treeControl1.Nodes仅给我父节点,但是我想获得所有节点的第一个可见节点。

我也知道我可能需要递归方法,但是正如我在一开始所说的那样,我现在有一个心理障碍,想尽快修复此问题:(

2 个答案:

答案 0 :(得分:0)

这可能可以解决您的问题:

public TreeNode GetLastVisibleNode ()
{
    var node = treeControl1.Nodes.Cast <TreeNode> ().Select (GetFirstVisibleNode).
                            FirstOrDefault (first => first != null);

    var retVal = node;
    while (node != null && node.IsVisible)
    {
        if (!node.IsSelected)
            retVal = node;
        node = node.NextVisibleNode;
    }

    return retVal;


    TreeNode GetFirstVisibleNode (TreeNode parentNode) =>
        parentNode.IsVisible
            ? parentNode
            : parentNode.Nodes.Cast <TreeNode> ().Select (GetFirstVisibleNode).
                         FirstOrDefault (childFirstNode => childFirstNode != null);
}

但是,我看不出您到底想达到什么目标。如果此解决方案不适合您,则应尝试更好地表达您的问题。

实际上,您似乎可以通过直接接收 last 可见节点来解决问题:

public TreeNode GetLastVisibleNode ()
{
    return treeControl1.Nodes.Cast <TreeNode> ().Select (GetLastVisibleNode).
                            LastOrDefault (first => first != null);


    TreeNode GetLastVisibleNode (TreeNode parentNode) =>
        parentNode.IsVisible
            ? parentNode
            : parentNode.Nodes.Cast <TreeNode> ().Select (GetLastVisibleNode).
                         LastOrDefault(childFirstNode => childFirstNode != null);
}

由于缺乏工作环境,我无法对此进行测试,但实际上它应该这样做。


好的,我想我应该解释一下我的代码。 这部分:

TreeNode GetFirstVisibleNode (TreeNode parentNode) =>
        parentNode.IsVisible
            ? parentNode
            : parentNode.Nodes.Cast <TreeNode> ().Select (GetFirstVisibleNode).
                         FirstOrDefault (childFirstNode => childFirstNode != null);

实际上与此相同:

TreeNode GetFirstVisibleNode (TreeNode parentNode)
{
    if (parentNode.IsVisible)
        return parentNode;
    foreach (var childNode in parentNode.Nodes.Cast <TreeNode> ())
    {
        var childFirstNode = GetFirstVisibleNode (childNode);
        if (childFirstNode != null)
            return childFirstNode;
    }

    return null;
}

第一个Linq查询类似。

return语句后面的那部分没有错-称为局部函数。您当然可以将其放在函数之外,但是由于您永远不需要将其放在GetLastVisibleNode()中,因此可以将其放在函数内。 Here,您可以阅读有关它的更多信息。

答案 1 :(得分:0)

我发现TreeView.TopNode为我提供了第一个可见节点。

从那以后,我只要遍历列表,直到node.IsVisible和node!= null。

public TreeNode GetLastVisibleNode()
{
    TreeNode node = treeControl1.TopNode;
    TreeNode retVal;
    do
    {
        retVal = node;
        node = node.NextVisibleNode;
    } while (node != null && node.IsVisible);

    return retVal;
}