我有“人物”类型的对象。 每个这样的对象都有一个名为ManagerID的属性。
在我的数据库中,数据是这样的:
Id,Name,ManagerId
我需要在asp.net上使用数据库数据构建一个树。树应该如下所示:
John
Lee
David
William
Ernest
Johan
Red
George
Gabriel
Albert
Don
Gabi
Marry
Helen
......etc
人们应该出现在经理的树下,每个子级别都会增加增量。
现在我将人员加载到列表中:
List<People> lst = loadPeople();
如何在树中转换列表? 谢谢。
答案 0 :(得分:1)
以下链接
http://www.codeproject.com/Articles/10997/Binding-Data-With-TreeView-Control-Asp-net-2-0
http://www.codeproject.com/Articles/24534/How-to-load-data-from-database-to-TreeView
答案 1 :(得分:1)
您可以按ManagerID对列表进行排序,假设没有经理的人有ManagerID = 0,因为重要的是首先添加“热门”管理员,然后开始从顶部添加并搜索父级,如果没有父母,那么人是“顶级”经理,没有经理,并将其添加到树视图的根目录。
这样的事情:
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);
}
}
}
}