代码之家  ›  专栏  ›  技术社区  ›  Awd

C#winform从自定义结构数组填充treeview

  •  0
  • Awd  · 技术社区  · 6 年前

    我有一个保存节点信息(level、index、childCount)的自定义结构,该结构按顺序存储在二进制文件中。现在,我需要从文件中重建TreeView,我得到了结构[],但仍在将结构转换为节点。这是一个图像,图像的左侧部分表示结构数组,与二进制文件结构相同。正确的部分是我想要构建的树视图。 enter image description here

    我只希望有人能给我一个关于递归函数的提示,因为我还在学习C#:)谢谢。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Anjo    6 年前

    我所做的函数假定,根据您提供的图像,级别始终从级别0开始。

    此函数还假设在级别0项之后,任何大于0的级别值都将被视为之前遇到的级别0项的子节点。

    我在这里所做的是,我根据您的结构创建了一个树节点列表和一个级别列表,并将根据级别在列表中循环,如果检测到级别大于最初提供的级别,将进行递归调用以处理子级别。

     public List<TreeNode> MainNodes(List<Levels> strut, int level){
    
        List<TreeNode> parentNode = new List<TreeNode>();
        for(int x = 0; x< strut.Count; x++){
            var data = strut[x];
            if(data.Level == level){
                TreeNode nodeC = new TreeNode();
                nodeC.Name = strut[x].Index.ToString(); //Index value from struct
                if(x + 1 < strut.Count){ 
                    if(strut[x+1].Level > level){
                        var newArray = new List<Levels>(strut);
                        newArray.RemoveAt(x);
                        nodeC.Nodes.AddRange(MainNodes(newArray, level + 1);
                    }
                }
                parentNode.Add(nodeC);
            }
        }
        return parentNode;
    }
    

    enter image description here 此函数根据您的需求返回节点和子节点。

        2
  •  0
  •   BKing    6 年前

    我认为您可以使用名称字段和查找函数。 名称是键和查找函数按名称字段查找节点。 首先,需要为每个节点保存唯一的键值。然后你就会 按键查找节点并建立层次结构

    这是sudo代码,

    Treeview myTreeView = new Treeview();
    
    TreeNode parentNode = new TreeNode();  // maybe it will index = 1 , level = 0 in your image
    parentNode.Name = "uniquevaule";
    myTreeView.nodes.add(parentNode);
    
    TreeNode childNode = new TreeNode(); // maybe it will index = 0 , level = 1
    childNode.Name = "child";
    TreeNode[] nodes = myTreeView.Nodes.Find("uniquevaule", true);
    nodes[0].add(childNode);