您可以按ManagerID對列表進行排序,假定沒有經理的人擁有ManagerID = 0,因爲重要的是會先添加「Top」管理者,然後開始從頂部添加並搜索父母,如果沒有父母,那麼人是沒有經理的「頂級」經理,並將其添加到樹視圖的根。
事情是這樣的:
protected void Page_Load(object sender, EventArgs e)
{
List<People> pplList = LoadPeople();
foreach (People person in pplList.OrderBy(pp => pp.ManagerID))
{
IEnumerable<TreeNode> nodes = Extensions.GetItems<TreeNode>(TreeViewPeople.Nodes, item => item.ChildNodes);
TreeNode parent = nodes.FirstOrDefault(nn => nn.Value.Equals(person.ManagerID.ToString()));
TreeNode newNode = new TreeNode(person.Name, person.ID.ToString());
if (parent == null)
TreeViewPeople.Nodes.Add(newNode);
else
parent.ChildNodes.Add(newNode);
}
}
這裏是GetItems方法將返回所有樹節點,從這裏取:https://stackoverflow.com/a/1815600/351383
public static class Extensions
{
public static IEnumerable<T> GetItems<T>(this IEnumerable collection, Func<T, IEnumerable> selector)
{
Stack<IEnumerable<T>> stack = new Stack<IEnumerable<T>>();
stack.Push(collection.OfType<T>());
while (stack.Count > 0)
{
IEnumerable<T> items = stack.Pop();
foreach (var item in items)
{
yield return item;
IEnumerable<T> children = selector(item).OfType<T>();
stack.Push(children);
}
}
}
}
是什麼在'loadPeople();'?你使用EF還是其他ORM?如果你只使用sql,你可以使用遞歸查詢。 –
loadPeople()是一種構建People類型對象列表的方法。該方法讀取數據庫,Web服務並執行一些過濾/驗證。重點是我有這個列表:列表女巫我需要渲染爲一棵樹。 –
每個人都有一位經理(只有一位)。並非所有人都是經理。 –