2

我想按类别组织一组ObjectMyPlugin) 。TreeView实际上我正在TreeView使用以下方法将它们添加到:

  internal static TreeNode AddPluginNode(TreeView parent, AbstractEnvChecker plugin)
  {
      TreeNode created = new TreeNode(plugin.Name) { Tag = plugin };
      parent.Nodes.Add(created);
      return created;
  }

// 我正在使用,Tag所以我可以MyPlugin Type为每个保存Node

这是我用来填充我TreeView的方法List<MyPlugin>

internal static void FillTreeViewWithPlugins(TreeView p_TreeView, Type p_Type, IList<AbstractEnvChecker> p_List)
{
    TreeNode v_TreeNode;
    if (p_TreeView != null)
    {
        p_TreeView.Nodes.Clear();
        foreach (object p_Item in p_List)
        {
            if (p_Item.GetType().IsSubclassOf(p_Type))
            {
                v_TreeNode = null;
                v_TreeNode = AddPluginNode(p_TreeView, p_Item as AbstractEnvChecker);

            }
        }
    }
}

一切正常,但问题是前面的方法显示了一个简单TreeView的包含然后列表的MyPlugin. 我想通过一个名为Category( String MyPlugin.Category) 的属性对它们进行分类。

所以我应该这样进行:

TreeNode testNodeA = new TreeNode("A"); 
TreeNode testNodeB = new TreeNode("B");
TreeNode testNodeC = new TreeNode("C");
TreeNode[] array = new TreeNode[] { testNodeA, testNodeB, testNodeC };
TreeNode cat = new TreeNode("Categorie X", array);
treeView1.Nodes.Add(cat);
  1. 如果我想保留我以前的代码,我不知道每个类别要添加多少插件,所以我不能使用Array固定尺寸的插件......
  2. 我不能使用List,因为TreeNode构造函数只接受ArrayTreeView.Nodes.Add方法只接受TreeNode......

我该怎么做 ?

4

1 回答 1

1

在创建节点时即时构建类别字典。稍后,仅将这些节点添加到树中。步骤如下:

声明这样的字典

Dictionary<string, TreeNode> categoryNodes = new ...;

键是类别名称,值是TreeNode类别的。

在遍历MyPlugin列表中的所有 s 时,检查字典中是否存在类别节点,如果没有则创建一个:

if (!categoryNodes.ContainsKey(p_Item.Category))
    categoryNodes[p_Item.Category] = new TreeNode(p_Item.Category);

TreeNode在相应的类别节点下为插件添加新的:

v_TreeNode = AddPluginNode(categoryNodes[p_Item.Category], p_Item as AbstractEnvChecker);

最后,将字典的所有值添加到树中:

foreach (string key in categoryNodes.Keys)
{
    p_TreeView.Nodes.Add(categoryNodes[key]);
}

您的代码应如下所示:

internal static void FillTreeViewWithPlugins(TreeView p_TreeView, Type p_Type, IList<AbstractEnvChecker> p_List)
{
    Dictionary<string, TreeNode> categoryNodes = new Dictionary<string, TreeNode>();
    TreeNode v_TreeNode;

    if (p_TreeView != null)
    {
        p_TreeView.Nodes.Clear();

        foreach (object p_Item in p_List)
        {
            if (p_Item.GetType().IsSubclassOf(p_Type))
            {
                if (!categoryNodes.ContainsKey(p_Item.Category))
                    categoryNodes[p_Item.Category] = new TreeNode(p_Item.Category);

                v_TreeNode = null;
                v_TreeNode = AddPluginNode(categoryNodes[p_Item.Category], p_Item as AbstractEnvChecker);    
            }
        }

        foreach (string cat in categoryNodes.Keys)
            p_TreeView.Nodes.Add(categoryNodes[cat]);
    }
}
于 2012-06-14T13:12:38.857 回答