我想按类别在Object中组织一组MyPluginTreeView)。
实际上,我正在使用以下方法将它们添加到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列表。我想通过称为CategoryString 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);



如果我想保留以前的代码,我不知道我将向每个类别添加多少个插件,因此无法使用固定尺寸的Array ...
我不能使用List,因为TreeNode构造函数仅接受Array,而TreeView.Nodes.Add方法仅接受TreeNode ...


我该怎么做 ?

最佳答案

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

这样声明字典

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


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

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

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]);
    }
}

关于c# - 在TreeView中对对象进行分类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11033632/

10-13 06:39