2016-05-13 41 views
0

我試圖在運行時在層次結構中填充TreeView,但是在我的代碼中發生了錯誤。TreeView層次結構是錯誤地生成的

通常情況下,我應該有許多項目作爲根節點,其次是子項目作爲子節點等等。

比方說,項目1,9,10,62和65是根源或項目。

  • 項目#1包含子項目17,24,33,34,35,61,98,...
  • 項目#9不包含子項目。
  • 項目#10含有子項目2和104
  • 項目#62包含子項目63,64,108,109。
  • 項目#65再次具有其他子項目。

enter image description here

問題:代碼保持添加到彼此根節點。所以它認爲下一個根節點是前一個節點的子節點。

結果:代碼應該創建帶有子項目的分離根節點(子項目也可以包含子項)。

代碼:

private void button2_Click(object sender, EventArgs e) 
{ 
    DbConnector db = new DbConnector(); 
    string str = ""; 
    List<string> lst = db.ReadProjectsTable(); 
    lst.OrderBy(x => x.Count(y => y == '|')); 

    List<string> newLst = new List<string>(); 
    foreach (var item in lst) 
    { 
     string output = ""; 
     foreach (var item2 in item.Split('|', '|')) 
     { 
      output += item2 + '-'; 
     } 
     output = output.Substring(output.IndexOf('-')+1, output.LastIndexOf('-')-2); 
     newLst.Add(output); 
     str += output + Environment.NewLine; 
    } 
    textBox2.Text = str; 

    tvProjects.PathSeparator = @"-"; 

    PopulateTreeView(tvProjects, newLst, '-'); 
} 

private static void PopulateTreeView(TreeView treeView, IEnumerable<string> paths, char pathSeparator) 
{ 
    TreeNode lastNode = null; 
    string subPathAgg; 
    foreach (string path in paths) 
    { 
     subPathAgg = string.Empty; 
     foreach (string subPath in path.Split(pathSeparator)) 
     { 
      subPathAgg += subPath + pathSeparator; 
      TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true); 
      if (nodes.Length == 0) 
       if (lastNode == null) 
        lastNode = treeView.Nodes.Add(subPathAgg, subPath); 
       else 
        lastNode = lastNode.Nodes.Add(subPathAgg, subPath); 
      else 
       lastNode = nodes[0]; 
     } 
    } 
} 

UPDATE:的List<string> lst

的樣本數據| 1 | | 9 | | 10 | | 62 | | 65 | | 67 | | 78 | | 83 | | 86 | | 105 | | 116 | | 125 | | 10 | 2 | | 67 | 4 | | 1 | 17 | | 1 | 24 | | 1 | 33 | | 1 | 34 | | 1 | 35 | | 1 | 61 | | 62 | 63 | | 62 | 64 | | 67 | 68 | | 65 | 69 | | 65 | 70 | | 65 | 71 | | 65 | 72 | | 65 | 75 |

+0

請提供樣本數據 - '名單 LST =新名單 {...};' –

+0

空白意味着列表中的新項目 – SamekaTV

+0

無法解析您的示例數據以提供您想要的結果。輸入數據應該有父母和孩子/孩子。 「1」沒有父母。 「1」的孩子是:「9」,「17」,「33」,「110」,「111」,「128」。 「9」是「10」的父親。 「10」是「62」的父親。 「62」是「65」的父親。 「65」是「63」,「64」,「108」,「109」的父項。 – jdweng

回答

1

在進入內循環之前,您應該將lastNode變量重置爲null。而爲了避免混淆和類似的錯誤,更好地在需要的地方去的地方聲明和初始化變量:

private static void PopulateTreeView(TreeView treeView, IEnumerable<string> paths, char pathSeparator) 
{ 
    foreach (string path in paths) 
    { 
     string subPathAgg = string.Empty; 
     TreeNode lastNode = null; 
     foreach (string subPath in path.Split(pathSeparator)) 
     { 
      subPathAgg += subPath + pathSeparator; 
      TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true); 
      if (nodes.Length == 0) 
       if (lastNode == null) 
        lastNode = treeView.Nodes.Add(subPathAgg, subPath); 
       else 
        lastNode = lastNode.Nodes.Add(subPathAgg, subPath); 
      else 
       lastNode = nodes[0]; 
     } 
    } 
}