【问题标题】:C# winform populate a treeview from a custom struct arrayC# winform 从自定义结构数组填充树视图
【发布时间】:2018-04-08 12:30:04
【问题描述】:

我有一个自定义结构,其中包含节点信息(级别,索引,childCount),并且该结构按顺序存储在二进制文件中。现在,我需要从文件中重建 TreeView,我得到了结构 [],但仍坚持将结构转换为节点。这是一个图像,图像的左侧部分表示结构数组,与二进制文件结构相同。右侧部分是我要构建的 TreeView。 enter image description here

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

【问题讨论】:

  • 你需要包含一些代码来告诉我们你卡在哪里了
  • TreeNode 是可序列化的,为什么需要自定义结构来保存它的信息?
  • @TnTinMn 来自二进制文件的自定义结构,不是我的工作,我正在努力破解文件结构。
  • 你可以试试这个链接...stackoverflow.com/questions/49702815/…

标签: c# winforms treeview


【解决方案1】:

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

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

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

 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;
}

此函数根据您的要求返回节点和子节点。

【讨论】:

  • 谢谢,这行得通,但一开始似乎有错误。 Nodes.AddRange() 需要 TreeNode[] 节点而不是 list,所以我将其更改为 nodeC.Nodes.AddRange(MainNodes(newArray, level + 1).ToArray())
  • 不用担心,只是使用列表进行测试,忘记将其更改回数组,因为它是您使用过的,但一切都很好:D
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多