Okay, it is just a very straightforward implementation, but it does the trick :)
List<string> files = new List<string>()
{
{"2001-01-01 - File 1"},
{"2001-01-01 - File 2"},
{"2001-01-02 - File 1"},
{"2001-01-03 - File 1"}
};
TreeView tv = new TreeView();
foreach(string file in files)
{
string y = file.Substring(0, 4);
string ym = file.Substring(0, 7);
string ymd = file.Substring(0, 10);
string fn = file.Substring(13);
TreeNode Node = tv.Nodes[y] ?? tv.Nodes.Add(y,y);
Node = Node.Nodes[ym] ?? Node.Nodes.Add(ym,ym);
Node = Node.Nodes[ymd] ?? Node.Nodes.Add(ymd,ymd);
Node.Nodes.Add(fn);
}
EDIT: So, I didn't really notice the information used a DateTime. In order for this, I now use a List filled with classes having a DateTime and a string filename:
List<fi> files = new List<fi>()
{
new fi(new DateTime(2001, 1, 1), "File 1"),
new fi(new DateTime(2001, 1, 1), "File 2"),
new fi(new DateTime(2001, 1, 3), "File 3"),
new fi(new DateTime(2001, 1, 1), "File 4"),
new fi(new DateTime(2001, 1, 2), "File 5"),
new fi(new DateTime(2001, 1, 2), "File 6"),
new fi(new DateTime(2001, 1, 2), "File 7")
};
TreeView tv = new TreeView();
var orderedfiles = from file in files orderby file.date ascending select file;
foreach(fi file in orderedfiles)
{
TreeNode Node = tv.Nodes[file.date.Year.ToString()] ?? tv.Nodes.Add(file.date.Year.ToString(), file.date.Year.ToString());
Node = Node.Nodes[file.date.ToString("yyyy-mm")] ?? Node.Nodes.Add(file.date.ToString("yyyy-mm"), file.date.ToString("yyyy-mm"));
Node = Node.Nodes[file.date.ToString("yyyy-mm-dd")] ?? Node.Nodes.Add(file.date.ToString("yyyy-mm-dd"), file.date.ToString("yyyy-mm-dd"));
Node.Nodes.Add(file.fn);
}