C# 如何为每个根节点子节点创建列表列表? 使用系统; 使用System.Collections.Generic; 使用系统组件模型; 使用系统数据; 使用系统图; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 使用System.Windows.Forms; 名称空间对话系统 { 公共部分类Form1:Form { List allnodes=new List(); 公共表格1() { 初始化组件(); 对于(int i=0;i

C# 如何为每个根节点子节点创建列表列表? 使用系统; 使用System.Collections.Generic; 使用系统组件模型; 使用系统数据; 使用系统图; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 使用System.Windows.Forms; 名称空间对话系统 { 公共部分类Form1:Form { List allnodes=new List(); 公共表格1() { 初始化组件(); 对于(int i=0;i,c#,winforms,C#,Winforms,如果列表中的所有节点如下所示: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Dialog_Sy

如果列表中的所有节点如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Dialog_System
{
    public partial class Form1 : Form
    {
        List<List<TreeNode>> allnodes = new List<List<TreeNode>>();

        public Form1()
        {
            InitializeComponent();

            for(int i = 0; i < advancedTreeView1.Nodes.Count; i++)
            {
                PrintNodesRecursive(advancedTreeView1.Nodes[i]);
            }
        }

        public List<TreeNode> PrintNodesRecursive(TreeNode oParentNode)
        {
            allnodes.Add(oParentNode);

            // Start recursion on all subnodes.
            foreach (TreeNode oSubNode in oParentNode.Nodes)
            {
                PrintNodesRecursive(oSubNode);
            }

            return allnodes;
        }
    }
}
List allnodes=new List();
结果是:

但我希望根节点0将是一个列表,它与他的孩子们在一起。 然后根节点1也是它自己的子节点的列表。 等等因此,在列表中,我将列出每个根节点及其子节点的所有节点

例如,在根节点0下,应该侦听节点3、4、5,而
列表不适用于此,因为级别数是预先给定的,并且始终为2。必须创建一个可以接受值和子项列表的类

List<TreeNode> allnodes = new List<TreeNode>();
我们面临的一个问题是,
TreeView
中没有根节点,因为
TreeView本身不是节点。因此,我使用的技巧是创建一个表示整个
TreeView
的虚拟
TreeNode

public Node<TreeNode> CloneRecursive(TreeNode treeNode)
{
    var node = new Node<TreeNode> { Value = treeNode };
    foreach (TreeNode subTreeNode in treeNode.Nodes) {
        node.Children.Add(CloneRecursive(subTreeNode));
    }
    return node;
}
var rootNode=newtreenode(“根”,AdvancedTreeView.Nodes.Cast().ToArray());
节点克隆=CloneRecursive(rootNode);
列出所有节点=clone.Children;
或者,我们可以通过循环调整您的解决方案:

var rootNode = new TreeNode("root", advancedTreeView1.Nodes.Cast<TreeNode>().ToArray());
Node<TreeNode> clone = CloneRecursive(rootNode);
List<Node<TreeNode>> allnodes = clone.Children;
List allnodes=new List();
foreach(高级TreeView.Nodes中的TreeNode TreeNode){
Add(CloneRecursive(treeNode));
}

另一种可能是只存储节点文本(这是可能的,因为我们的节点类是泛型的)

public Node clonetextracrovive(TreeNode TreeNode)
{
var节点=新节点{Value=treeNode.Text};
foreach(TreeNode.Nodes中的TreeNode子屏幕){
node.Children.Add(CloneTextRecursive(subTreeNode));
}
返回节点;
}

此行在foreach中获取错误:allnodes.Add(CloneRecursive(treeNode));无法从“Form1.Node”转换为“System.Windows.Forms.TreeNode”,因为
所有节点
必须键入为
列表
(不仅仅是
列表
)。或者,您可以使
节点
非泛型。然后这将成为
列表
var rootNode = new TreeNode("root", advancedTreeView1.Nodes.Cast<TreeNode>().ToArray());
Node<TreeNode> clone = CloneRecursive(rootNode);
List<Node<TreeNode>> allnodes = clone.Children;
List<Node<TreeNode>> allnodes = new List<Node<TreeNode>>();
foreach (TreeNode treeNode in advancedTreeView1.Nodes) {
    allnodes.Add(CloneRecursive(treeNode));
}
public Node<string> CloneTextRecursive(TreeNode treeNode)
{
    var node = new Node<string> { Value = treeNode.Text };
    foreach (TreeNode subTreeNode in treeNode.Nodes) {
        node.Children.Add(CloneTextRecursive(subTreeNode));
    }
    return node;
}