using System.Collections.Generic;
public static void Main()
var lista = new List<Nodo> {
new Nodo { Id = 1, ParentId = null, DisplayOrder = 1, Text = "Root" },
new Nodo { Id = 2, ParentId = 1, DisplayOrder = 1, Text = "Cat 1" },
new Nodo { Id = 3, ParentId = 1, DisplayOrder = 2, Text = "Cat 2" },
new Nodo { Id = 8, ParentId = 1, DisplayOrder = 1, Text = "Cat 3" },
new Nodo { Id = 4, ParentId = 2, DisplayOrder = 1, Text = "Subcat 1.1" },
new Nodo { Id = 5, ParentId = 2, DisplayOrder = 2, Text = "Subcat 1.2" },
new Nodo { Id = 6, ParentId = 5, DisplayOrder = 1, Text = "Subcat 1.2.1" },
new Nodo { Id = 7, ParentId = 3, DisplayOrder = 1, Text = "Subcat 2.1" }
BuildTreeView(lista, 1, 0);
public static void BuildTreeView(IEnumerable<Nodo> data, int ? parentid = 1, int level = 0, string accumulatore = "")
var nodes = data.Where(n => n.ParentId == parentid).OrderBy(n => n.DisplayOrder);
if (nodes.First().ParentId != null)
Console.Write("<select>");
foreach (var node in nodes)
BuildTreeView(data, node.Id, level + 1, accumulatore + separatore + node.Text);
Console.Write("\r\n</select>");
Console.Write(string.Format("\r\n<option value=\"{0}\">{1}</option>", data.Single(nodo => nodo.Id == parentid.Value).Text, accumulatore));