2013-02-28 37 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