【问题标题】:Generating a TreeView hierarchy from a path-like string - C# .NET从类似路径的字符串生成 TreeView 层次结构 - C# .NET
【发布时间】:2014-02-19 13:35:01
【问题描述】:

在我的程序中,用户使用元数据标记文件,他可以从有限且已知数量的框中选择(假设框是年、月和日)。然后将文件移动到通过组合所选数据创建的路径中。

我希望用户能够在程序设置中指定如何通过字符串创建路径,例如

[ROOT]\%year%\%month%\%day%

或三者的任何其他组合。他应该能够根据需要指定尽可能多的子级别。

现在,我有一个 TreeView 控件,我想根据用户选择的配置字符串显示 general 文件夹结构的预览,无论该文件夹是否已存在。

我希望每年文件夹都有所有月份的子文件夹,每个月的子文件夹都有全天的子文件夹(忽略不同月份的实际天数,这只是一个示例)

现在我有一个包含年、月和日值的列表,以及一个将每个列表链接到带有其名称的字符串的字典:

public partial class Form1 : Form
{
    string StructureString = @"year\month\day";
    string[] StructureArray = StructureString.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);

    List<string> year = new List<string>() {"2014", "2013", "2012"};
    List<string> month = new List<string>() {"January", "February", ... , "December"};
    List<string> day = new List<string>() {"1", "2", ... , "31"};

    Dictionary<string, List<string>> StructureData = new Dictionary<string, List<string>>();
}

public Form1()
{
    InitializeComponent();  // Designer code
    InitializeData();
    PopulateTreeView();
}

private InitializeData()
{
    StructureData.Add("year", year);
    StructureData.Add("month", month);
    StructureData.Add("day", day);
}

现在,我知道我必须在这里使用递归,并且我已经设法拥有一个 TreeView,它可以通过文件系统中的现有子目录进行爬网。但我不知道如何在这里进行。

我正在尝试类似:

    int i = 0;

    private void PopulateTreeView()
    {
        treeView1.Nodes.Add(AddSubNode(i));
    }

    private TreeNode AddSubNode(int level)
    {
        TreeNode tn = new TreeNode();

        foreach (string s in StructureData[StructureArray[i]])
        {
          if (i < StructureArray.Length)
          {
              tn.Nodes.Add(AddSubNode(i + 1));
          }
        }
        i++;

        return tn;
    }

但我得到了 StackOverflowException。而且,一般来说,我什至不确定我在这里编写的代码是否有意义。任何帮助我走上正确方向的帮助都将非常感激。

谢谢!

【问题讨论】:

    标签: c# recursion treeview hierarchy


    【解决方案1】:

    一些用户回答了我的问题,我设法复制了代码,然后他删除了他自己的答案。它存在一些问题(变量名称错误,并且 - 正如 LarsTech 所指出的 - 节点是空白的),但我能够调整他的解决方案并提出所需的结果。

    我将其发布为其他有相同问题的人的答案。

    private void PopulateTreeView()
    {
        treeView1.Nodes.Add(AddSubNode(0, new TreeNode("Root")));
    }
    
    private TreeNode AddSubNode(int level, TreeNode hierarchy)
    {
        if (level == StructureArray.Length)
        {
            return hierarchy;
        }
    
        foreach (string s in StructureData[StructureArray[i]])
        {
            tn.Nodes.Add(AddSubNode(level + 1, new TreeNode(s)));
        }
        return tn;
    }
    

    要自定义节点属性(文本、标签、图像...),而不是键入“new Treenode()”作为函数参数,而是提前声明一个 TreeNode 对象,然后设置其属性,最后将其用作函数参数。

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多