C# 从类似string-C.NET的路径生成TreeView层次结构
在我的程序中,用户用元数据标记文件,他可以从有限且已知数量的框中选择,假设框是年、月和日。然后将文件移动到通过组合选定数据创建的路径中 我希望用户能够在程序设置中指定如何通过字符串创建路径,例如 [根用户]\%year%\%month%\%day% 或者三者的任何其他组合。他应该能够根据需要指定尽可能多的子级别 现在,我有了一个TreeView控件,我想根据用户选择的配置字符串显示常规文件夹结构的预览,不管该文件夹是否已经存在 我希望“每年”文件夹中包含“所有月份”子文件夹,“每月”子文件夹中包含“全天”子文件夹,而不考虑不同月份的实际天数,这只是一个示例 现在,我有保存年、月和日值的列表,还有一个字典将每个列表链接到带有名称的字符串:C# 从类似string-C.NET的路径生成TreeView层次结构,c#,recursion,treeview,hierarchy,C#,Recursion,Treeview,Hierarchy,在我的程序中,用户用元数据标记文件,他可以从有限且已知数量的框中选择,假设框是年、月和日。然后将文件移动到通过组合选定数据创建的路径中 我希望用户能够在程序设置中指定如何通过字符串创建路径,例如 [根用户]\%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对象,然后设置其属性,最后将其用作函数参数