gpt4 book ai didi

c# - 有什么方法可以通过提供节点数来访问 TreeView 节点

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:34 26 4
gpt4 key购买 nike

我知道通过使用 tagtext 可以搜索一个节点并找到它。

treeview1.Find(string name, bool searchAllChildren)

但在我的代码中,我有一个 for 循环执行一些计算的整数,然后我想将 TreeView 的 i-th 节点复制到新节点。例如我想给 i = 3 并且它应该给我 node5 和所有 child 。

让我们在 XML 中拥有如下图所示的结构。我的目标是通过以下方式生成 TreeView 。

首先,复制所有节点和子节点,直到 nodeIV,然后复制节点 node1, .... node7 并在条件下保存它们,否则创建空节点.

-root
-nodeI
-nodeII
-nodeIII
-nodeIV
-node1
-children1
-children2
-children3
-node2
-node3
-childrenA
-childrenB
-childrenC
-node4
-node5
-node6
-children
-node7
-childrenG
-childrenR1
-childrenR2
-childrenR3
-children

有没有这样一种方式,或者只有一个人可以访问节点,

最佳答案

首先,我不会重新发明轮子,而是使用我对 How to flatten tree via LINQ? 的回答中的辅助函数这对于任何树状结构都非常有用:

public static class TreeUtils
{
public static IEnumerable<T> Expand<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> elementSelector)
{
var stack = new Stack<IEnumerator<T>>();
var e = source.GetEnumerator();
try
{
while (true)
{
while (e.MoveNext())
{
var item = e.Current;
yield return item;
var elements = elementSelector(item);
if (elements == null) continue;
stack.Push(e);
e = elements.GetEnumerator();
}
if (stack.Count == 0) break;
e.Dispose();
e = stack.Pop();
}
}
finally
{
e.Dispose();
while (stack.Count != 0) stack.Pop().Dispose();
}
}
}

然后我会创建几个 TreeView 特定的助手:

public static class TreeViewUtils
{
public static IEnumerable<TreeNode> AsEnumerable(this TreeNodeCollection source)
{
return source.Cast<TreeNode>();
}

public static IEnumerable<TreeNode> All(this TreeNodeCollection source)
{
return source.AsEnumerable().Expand(node => node.Nodes.Count > 0 ? node.Nodes.AsEnumerable() : null);
}

public static TreeNode Find(this TreeNodeCollection source, int index)
{
return source.All().Skip(index).FirstOrDefault();
}
}

现在要获取 TreeView 的i-th 节点,您可以简单地使用

var node = treeview1.Nodes.Find(i);

此外,您可以像这样获取任何节点的i-th 子节点

var childNode = node.Nodes.Find(i);

总而言之,我可以很容易地提供一个递归函数,它只用更少的代码就可以解决特定的问题,但是这个小实用函数会给你更多的东西——foreach 支持,子树的所有节点DFT 遍历、LINQ 查询(如通过 Tag 或其他一些条件搜索)等。

更新

如今的需求很奇怪,但这里是“原始”C# 函数(没有 LINQ、没有扩展方法、没有迭代器方法),正好满足您的需求

public static class TreeViewUtils
{
public static TreeNode FindNode(TreeNodeCollection nodes, int index)
{
int offset = -1;
return FindNode(nodes, ref offset, index);
}
private static TreeNode FindNode(TreeNodeCollection nodes, ref int offset, int index)
{
for (int i = 0; i < nodes.Count; i++)
{
var node = nodes[i];
if (++offset == index || (node = FindNode(node.Nodes, ref offset, index)) != null)
return node;
}
return null;
}
}

以及各自的用法

var node = TreeViewUtils.FindNode(treeview1.Nodes, i);

var childNode = TreeViewUtils.FindNode(node.Nodes, i);

关于c# - 有什么方法可以通过提供节点数来访问 TreeView 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34899449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com