对树视图中的对象进行分类

本文关键字:分类 对象 视图 | 更新日期: 2023-09-27 18:37:15

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

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

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

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

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);
  1. 如果我想保留我以前的代码,我不知道我将向每个类别添加多少个插件,所以我无法使用具有固定尺寸的Array......
  2. 我不能使用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]);
    }
}