Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从类似string-C.NET的路径生成TreeView层次结构_C#_Recursion_Treeview_Hierarchy - Fatal编程技术网

C# 从类似string-C.NET的路径生成TreeView层次结构

C# 从类似string-C.NET的路径生成TreeView层次结构,c#,recursion,treeview,hierarchy,C#,Recursion,Treeview,Hierarchy,在我的程序中,用户用元数据标记文件,他可以从有限且已知数量的框中选择,假设框是年、月和日。然后将文件移动到通过组合选定数据创建的路径中 我希望用户能够在程序设置中指定如何通过字符串创建路径,例如 [根用户]\%year%\%month%\%day% 或者三者的任何其他组合。他应该能够根据需要指定尽可能多的子级别 现在,我有了一个TreeView控件,我想根据用户选择的配置字符串显示常规文件夹结构的预览,不管该文件夹是否已经存在 我希望“每年”文件夹中包含“所有月份”子文件夹,“每月”子文件夹中包

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

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

[根用户]\%year%\%month%\%day%

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

现在,我有了一个TreeView控件,我想根据用户选择的配置字符串显示常规文件夹结构的预览,不管该文件夹是否已经存在

我希望“每年”文件夹中包含“所有月份”子文件夹,“每月”子文件夹中包含“全天”子文件夹,而不考虑不同月份的实际天数,这只是一个示例

现在,我有保存年、月和日值的列表,还有一个字典将每个列表链接到带有名称的字符串:

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);
}
现在,我知道我必须在这里使用递归,并且我已经成功地创建了一个树视图,它通过文件系统中现有的子目录进行扩展。但我不知道该怎么做

我正在尝试类似于:

    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。而且,一般来说,我甚至不确定我在这里编写的代码是否有意义。如果能帮我找到正确的方向,我将不胜感激


谢谢大家!

某个用户回答了我的问题,我设法复制了代码,然后他删除了自己的答案。它存在一些问题,变量名错误,正如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;
}
要自定义节点属性text、tag、images…,而不是键入new Treenode作为函数参数,请事先声明Treenode对象,然后设置其属性,最后将其用作函数参数