2013-02-28 63 views
2

我幾乎已經掌握了它,但我很難優雅地完成最後一部分。這個答案是根據Jeremy Thompson提交的答案進行更新的。這是我到目前爲止:從程序集動態生成WinForms TreeView

public void SetupTree() 
{ 
    var types = Assembly.Load("Data").GetTypes().Where(t => t.IsPublic && t.IsClass); 

    if (types.Count() > 0) 
    { 
     if (treeView_left.Nodes.Count == 0) 
     { 
      treeView_left.Nodes.Add(new TreeNode("Structure Data")); 
      treeView_left.Nodes[0].Nodes.Add(types.First().GetHashCode().ToString(), types.First().Name); 
     } 

     foreach (Type type in types) 
     { 
      BuildTree(types, type, treeView_left.Nodes[0].Nodes[0]); 
     } 
    } 

    treeView_left.Refresh(); 
} 

private void BuildTree(IEnumerable<Type> types, Type type, TreeNode parentNode) 
{ 
    var tempNodes = treeView_left.Nodes.Find(type.BaseType.GetHashCode().ToString(), true); 
    if (tempNodes.Count() > 0) 
    { 
     parentNode = tempNodes[0]; 
     if (tempNodes.Count() != 1) 
     { 
      //TODO: warning 
     } 
    } 

    if (parentNode != null) 
    { 
     if (treeView_left.Nodes.Find(type.GetHashCode().ToString(), true).Count() == 0) 
     { 
      parentNode.Nodes.Add(type.GetHashCode().ToString(), type.Name); 
     } 

     foreach (Type t in types.Where(x => x.IsSubclassOf(type))) 
     { 
      BuildTree(types, t, parentNode.Nodes[type.GetHashCode().ToString()]); 
     } 
    } 
} 

這產生了我期待的結果,但我懷疑我正在做一些這種尷尬。如果任何人都能指出最後一部分的更清潔的方法,我會認識它。

+1

你的方法需要快速響應 – 2013-02-28 01:00:29

+0

我一直在努力弄清楚這樣的事情的最佳地點,我要麼終止跨越我希望這種方法使用的一般性質,或者它不會放置任何東西 – 2013-02-28 01:04:37

+0

我正在工作在它上面 – 2013-02-28 01:05:46

回答

1

我還沒有測試過,但注意遞歸調用LoadAllChildren自己調用。

public void SetupTree() 
{ 
    Assembly dataLib = Assembly.Load("Data"); 
    TreeNode theTree = new TreeNode("Assembly Data"); 

    foreach (Type type in dataLib.GetTypes()) 
    { 
     LoadAllChildren(dataLib, type, theTree); 
    } 

    treeView_left.Nodes.Add(theTree); //Optimisation - bind all nodes in one go rather than adding individually 
} 

private void LoadAllChildren(Assembly dataLib,Type type, TreeNode parentNode) 
{ 
    if (type.IsPublic && type.IsClass) 
    {    
     TreeNode node = new TreeNode(type.Name); 
     parentNode.Nodes.Add(node);   

     var types = dataLib.GetTypes().Where(x => x.IsSubclassOf(type)); 
     foreach (Type t in types) 
     { 
      LoadAllChildren(dataLib, t, node); 
     } 
    } 
} 

我希望這是足以讓你過欄,隨意問Q的

我不會爲我的電腦即將獲得重建:(

+0

謝謝傑里米 - 它幾乎就在那裏,你實際上和我在之前發佈之前的相同點。它創建樹 - 但是每個項目和它的子項都被添加到項目的基礎中。它需要停止鏈條,如果它被添加。 – 2013-02-28 01:47:27

+0

使用正確執行子類別的版本更新了我的問題。儘管如此,仍然想清理它。 – 2013-02-28 04:50:00

+0

將此標記爲答案,但請注意,它添加了太多類別。請參閱已完成解決方案的更新問題。 – 2013-03-01 21:57:41