「トップ」マネージャーが最初に追加されることが重要であるため、マネージャーを持たない人は ManagerID = 0 を持っていると仮定して、リストを ManagerID で並べ替えることができます。親の場合、人は「トップ」マネージャーであり、彼にはマネージャーがなく、ツリービューのルートに追加します。
このようなもの :
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 メソッドを次に示します。
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);
}
}
}
}