C# 列表中的asp.net树结构

C# 列表中的asp.net树结构,c#,asp.net,treeview,C#,Asp.net,Treeview,我有“人”类型的对象。 每个这样的对象都有一个名为ManagerID的属性 在我的数据库中,数据如下所示: John Lee David William Ernest Johan Red George Gabriel Albert Don Gabi Marry Helen ......etc Id,Name,ManagerId 我需要用数据库数据在asp.net上建立一个树。该树应如下所示: John Le

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

在我的数据库中,数据如下所示:

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

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

John
Lee
David
  William
  Ernest
    Johan
      Red
    George
    Gabriel
      Albert
      Don
        Gabi
  Marry
Helen
......etc
人员应出现在经理下方的树上,每个子级别增加增量

现在,我将这些人加载到一个列表中:

List<People> lst = loadPeople();
List lst=loadPeople();
如何转换树中的列表? 谢谢。

以下链接

这个不错。

您可以按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);          
  }
}
受保护的无效页面加载(对象发送方,事件参数e)
{
List pplList=LoadPeople();
foreach(pplList.OrderBy(pp=>pp.ManagerID)中的人)
{
IEnumerable节点=Extensions.GetItems(TreeViewPeople.nodes,item=>item.ChildNodes);
TreeNode parent=nodes.FirstOrDefault(nn=>nn.Value.Equals(person.ManagerID.ToString());
TreeNode newNode=newtreenode(person.Name,person.ID.ToString());
如果(父项==null)
TreeViewPeople.Nodes.Add(newNode);
其他的
parent.ChildNodes.Add(newNode);
}
}
下面是GetItems方法,它将返回所有树节点,从这里获取:

公共静态类扩展
{
公共静态IEnumerable GetItems(此IEnumerable集合,Func选择器)
{
堆栈=新堆栈();
stack.Push(collection.OfType());
而(stack.Count>0)
{
IEnumerable items=stack.Pop();
foreach(项目中的var项目)
{
收益回报项目;
IEnumerable children=选择器(项).OfType();
堆叠、推送(儿童);
}
}
}
}

loadPeople()中的内容?您是否使用EF或任何其他ORM?如果只使用sql,则可以使用递归查询。loadPeople()是一种构建People类型对象列表的方法。该方法从数据库、web服务中读取数据,并进行一些筛选/验证。关键是我有一个列表:列表,我需要将其呈现为一个树。每个列表可能有一个管理器(并且只有一个)。不是所有的人都是经理,谢谢。工作(几乎)很好。我唯一的问题是treeView1.Nodes没有Find()方法。我使用treeView1.FindNode(字符串id),但是这个方法不使用递归搜索,只搜索第一级。在开始自己编写递归搜索之前,请告诉我应该如何访问该方法?我需要什么参考资料?我使用的是framework 4.0。哦,对不起,这是WinForms树视图,对于ASP.NET,你必须使用递归函数来迭代所有节点,看这里:我更新了我的答案供将来的读者阅读,现在是ASP.NET树视图。我知道这已经有一段时间了,但“TreeViewPeople.nodes”到底是什么?