我现在有一个精神障碍,这并不难。
我有一个应该获取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仅给我父节点,但是我想获得所有节点的第一个可见节点。
我也知道我可能需要递归方法,但是正如我在一开始所说的那样,我现在有一个心理障碍,想尽快修复此问题:(
答案 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;
}