来自List的asp.net树结构

时间:2012-08-28 09:01:39

标签: c# asp.net treeview

我有“人物”类型的对象。 每个这样的对象都有一个名为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();

如何在树中转换列表? 谢谢。

2 个答案:

答案 0 :(得分:1)

答案 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);
        }
      }
    }
  }