2014-06-23 118 views
1

我有表有兩列:填充樹狀動態子節點

+-------------+------------+ 
| Level  | Desc  | 
+-------------+------------+ 
| 1   | a   | 
+-------------+------------+  
| 2   | b   | 
+-------------+------------+ 
| 2   | c   | 
+-------------+------------+  
| 1   | d   | 
+-------------+------------+ 
| 2   | e   | 
+-------------+------------+  
| 2   | f   | 
+-------------+------------+ 
| 3   | g   | 
+-------------+------------+  
| 1   | h   | 
+-------------+------------+ 
| 1   | i   | 
+-------------+------------+ 
| 2   | j   | 
+-------------+------------+ 
| 2   | k   | 
+-------------+------------+ 

我需要根據級別列創建此數據在樹視圖的顯示,它 應該是這樣的:

- 1 a 
    -- 2 b 
    -- 2 c 
-1 d 
    -- 2 e 
    -- 2 f 
     -- 3 g 
-1 h 
-1 i 
    -- 2 j 
    -- 2 k 

因此,級別列代表節點。第1級是主節點,第2級是級別1的子節點,第3級是第2級子節點,第4級是子節點3 ...我知道如何在有固定數量的節點和子節點時填充樹視圖,但是在這種情況下不知道如何填充1個節點組成3個,4個或更多子節點的位置。

+0

你怎麼保持這個表? – Adrian

+0

有兩列的數據表(int,string) – Josef

+1

我糾正了一個小錯誤。 – Adrian

回答

2

希望它會幫助你,我想你的例子,它成功地工作

private void PopulateTreeView_Load(object sender, EventArgs e) 
    { 
     DataTable table = new DataTable(); 
     table.Columns.Add("Level"); 
     table.Columns.Add("Data"); 

     table.Rows.Add(1, "a"); 
     table.Rows.Add(2, "b"); 
     table.Rows.Add(2, "c"); 
     table.Rows.Add(1, "d"); 
     table.Rows.Add(2, "e"); 
     table.Rows.Add(2, "f"); 
     table.Rows.Add(3, "g"); 
     table.Rows.Add(4, "z"); 
     table.Rows.Add(5, "x"); 
     table.Rows.Add(2, "h"); 
     table.Rows.Add(3, "i"); 
     table.Rows.Add(1, "j"); 
     table.Rows.Add(2, "k"); 

     TreeNode lastNode = new TreeNode();  

     for (int i = 0; i < table.Rows.Count; i++) 
     { 
      TreeNode newNode = new TreeNode((string)table.Rows[i]["Data"]);     

      if (i == 0) 
       treeView.Nodes.Add(newNode); 
      else 
      { 
       int currentLevel = Convert.ToInt32(table.Rows[i]["Level"]); 
       int lastLevel = Convert.ToInt32(table.Rows[i-1]["Level"]); 

       if (currentLevel < lastLevel) 
       { 
        if (currentLevel == 1) 
         treeView.Nodes.Add(newNode); 
        else 
        { 
         TreeNode currentNode = lastNode.Parent; 

         for (int j = 0; j < lastLevel - currentLevel; j++) 
          currentNode = currentNode.Parent; 

         currentNode.Nodes.Add(newNode); 
        } 
       } 
       else if (currentLevel == lastLevel) 
       { 
        if (lastLevel == 1) 
         treeView.Nodes.Add(newNode); 
        else 
         lastNode.Parent.Nodes.Add(newNode);          
       } 
       else 
       { 
        lastNode.Nodes.Add(newNode); 
       } 
      } 

      lastNode = newNode; 
     }   
    } 

enter image description here

+0

正是我需要的!非常感謝! – Josef