0

我有“人”类型的对象。每个这样的对象都有一个名为 ManagerID 的属性。

在我的数据库中,数据是这样的:

ID、名称、ManagerId

我需要在 asp.net 上用数据库数据构建一棵树。树应如下所示:

John
Lee
David
  William
  Ernest
    Johan
      Red
    George
    Gabriel
      Albert
      Don
        Gabi
  Marry
Helen
......etc

人应该出现在经理下的树上,每个子级别都会增加增量。

现在我将人员加载到列表中:

List<People> lst = loadPeople();

如何转换树中的列表?谢谢你。

4

2 回答 2

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);
        }
      }
    }
  }
于 2012-08-28T10:34:21.780 回答