【问题标题】:asp.net tree structure from a List列表中的asp.net树结构
【发布时间】:2012-08-22 18:20:46
【问题描述】:

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

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

Id、名称、ManagerId

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

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

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

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

List<People> lst = loadPeople();

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

【问题讨论】:

  • loadPeople(); 中有什么内容?您使用 EF 或任何其他 ORM 吗?如果你只使用 sql,你可以使用递归查询。
  • loadPeople() 是一种构建 People 类型对象列表的方法。该方法从数据库、Web 服务读取并执行一些过滤器/验证。关键是我有一个列表: List 女巫我需要渲染为一棵树。
  • 每个人都可以有一个经理(而且只有一个)。并非所有人都是经理。

标签: c# asp.net treeview


【解决方案1】:
【解决方案2】:

您可以按 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);
        }
      }
    }
  }

【讨论】:

  • 谢谢。工作(几乎)很好。我唯一的问题是 treeView1.Nodes 没有 Find() 方法。我用的是treeView1.FindNode(String id),但是这个方法不使用递归搜索,只搜索第一级。在开始自己编写递归搜索之前,请告诉我应该怎么做才能访问该方法?有什么我需要的参考吗?我使用框架 4.0。
  • 抱歉,这是针对 WinForms 树视图的,对于 ASP.NET,您必须使用递归函数来迭代所有节点,请看这里:stackoverflow.com/a/3767926/351383
  • 我为未来的读者更新了我的答案,现在它适用于 ASP.NET 树视图
  • 我知道它已经有一段时间了,但是“TreeViewPeople.Nodes”到底是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多