C#winform从自定义结构数组

时间:2018-04-08 12:30:04

标签: c# winforms treeview

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

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

2 个答案:

答案 0 :(得分:0)

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

这是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);

答案 1 :(得分:0)

我所做的功能假设水平总是从你提供的图像开始在0级。

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

我在这里做的是,我已经根据你的结构创建了一个TreeNodes列表和一个Levels列表,并且如果检测到一个级别大于最初提供的级别,它将基于级别循环遍历列表,将进行递归调用以处理子级别。

 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 此函数根据您的要求返回节点和子节点。