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



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

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

[ROOT]\%年%\%月%\%日%

或三者的任何其它组合。他应该能够指定他需要的子级别。

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

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

现在,我有一个包含年、月和天值的列表,还有一个字典,将每个列表链接到具有名称的字符串:

public partial class Form1 : Form
{
string StructureString = @"yearmonthday";
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。而且,一般来说,我甚至不确定我在这里编码的内容是否有意义。如果能为我指明正确的方向,我们将不胜感激。

谢谢!

一些用户回答了我的问题,我设法复制了代码,然后他删除了自己的答案。它有一些问题(正如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;
}

要自定义节点属性(文本、标记、图像…),请预先声明Treenode对象,然后设置其属性,最后将其用作函数参数,而不是键入"new Treenode()"作为函数参数。

最新更新