首先我们有全能代码!
List nodes = new List();
TreeNode Temp = new TreeNode();
TreeNodeCollection nodeList = treeViewTab4DirectoryTree.Nodes;
while (nodeList.Count != 0)
{
Temp = nodeList[0];
while (Temp.FirstNode != null)
{
Temp = Temp.FirstNode;
}
if (!nodes.Contains(Temp.FullPath))
{
nodes.Add(Temp.Text);
}
nodeList.Remove(Temp);
}
现在出现问题:我编写了上面的代码,目的是创建一个List,其中包含树中所有节点的文本。这非常有效。我遇到的问题是当我从变量中删除节点时,它们也会从实际列表中删除。问题是如何制作节点列表的副本,以便我可以使用它们而不会弄乱ACTUAL列表。如何在不引用它的情况下复制它?任何帮助将不胜感激!
答案 0 :(得分:2)
您的问题出现是因为“nodeList”是对treeViewTab4DirectoryTree.Nodes的引用,而不是它的副本。
解决方案完全取决于您使用的TreeNodeCollection类型(WinForms,ASP.net,还有其他什么?),因为您需要查找.Copy(),. Clone(),. TooArray ()方法或类似的方法来获取集合内容的副本,而不是对现有集合的引用。
例如,如果您使用的是asp.net,因此使用 System.Web.UI.WebControls.TreeNodeCollection ,则可以使用.CopyTo方法,其方式与此类似:< / p>
TreeNode[] x = null;
treeViewTab4DirectoryTree.Nodes.CopyTo(x, 0);
答案 1 :(得分:2)
更新以显示基于堆栈的方法:
List<String> result = new List<String>();
Stack<IEnumerator> nodeColls = new Stack<IEnumerator>();
IEnumerator nodes = treeViewTab4DirectoryTree.Nodes.GetEnumerator();
nodeColls.Push(null);
while (nodes != null)
{
while (nodes.MoveNext())
{
result.add(nodes.Current.FullPath);
if (nodes.Current.FirstNode != null)
{
nodeColls.Push(nodes);
nodes = nodes.Current.Nodes.GetEnumerator();
}
}
nodes = nodeColls.Pop();
}
下面的代码不像注释中提到的那样工作,因为它不遍历整个树,而只占用每个顶级分支的第一个叶节点。
我实际上认为原始代码(在问题中)也这样做了,因为我认为删除实际上会在找到它下面的第一个叶节点后删除顶级节点;但是,它尝试从顶级节点集合中删除叶节点,如果找不到它,则忽略它。
原帖,无效代码
首先,为什么需要从列表中删除项目?
List<string> nodes = new List<string>();
foreach (TreeNode tn in treeViewTab4DirectoryTree.Nodes)
{
TreeNode temp = tn;
while (Temp.FirstNode != null)
{
Temp = Temp.FirstNode;
}
if (!nodes.Contains(Temp.FullPath))
{
nodes.Add(Temp.Text);
}
}
要回答您的具体问题,假设Nodes集合实现了IEnumerable,请使用:
List<TreeNode> nodeList = new List<TreeNode>(treeViewTab4DirectoryTree.Nodes);
如果您决定坚持使用while循环,可以通过更改
来保存实例TreeNode Temp = new TreeNode();
到
TreeNode Temp = null;
...您实际上从未使用过您创建的对象,至少在您展示的代码部分中是这样。