2012-08-28 78 views
0

我有「People」類型的對象。 每個這樣的對象都有一個名爲ManagerID的屬性。來自列表的asp.net樹形結構

在我的數據庫中的數據是這樣的:

ID,姓名,經理ID

我需要在asp.net構建樹與數據庫中的數據。樹應該看起來像這樣:

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

人們應該出現在管理器下的樹上,每個子級增加增量。

現在我加載人名單:

List<People> lst = loadPeople(); 

如何轉變在樹中的列表? 謝謝。

+0

是什麼在'loadPeople();'?你使用EF還是其他ORM?如果你只使用sql,你可以使用遞歸查詢。 –

+0

loadPeople()是一種構建People類型對象列表的方法。該方法讀取數據庫,Web服務並執行一些過濾/驗證。重點是我有這個列表:列表女巫我需要渲染爲一棵樹。 –

+0

每個人都有一位經理(只有一位)。並非所有人都是經理。 –

回答

1

您可以按ManagerID對列表進行排序,假定沒有經理的人擁有ManagerID = 0,因爲重要的是會先添加「Top」管理者,然後開始從頂部添加並搜索父母,如果沒有父母,那麼人是沒有經理的「頂級」經理,並將其添加到樹視圖的根。

事情是這樣的:

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); 
     } 
     } 
    } 
    } 
+0

謝謝。工程(幾乎)很好。我唯一的問題是treeView1.Nodes沒有Find()方法。我使用treeView1.FindNode(String id),但此方法不使用遞歸搜索,只搜索第一級。在開始編寫自己的遞歸搜索之前,請告訴我該怎麼做才能訪問該方法?有我需要的任何參考?我使用框架4.0。 –

+0

哦對不起,它是用於WinForms樹形視圖,對於ASP.NET,您必須使遞歸函數遍歷所有節點,請看這裏:http://stackoverflow.com/a/3767926/351383 –

+0

謝謝。我已經完成了這棵樹。 –