对树视图中的对象进行分类
本文关键字:分类 对象 视图 | 更新日期: 2023-09-27 18:37:15
我想按类别在TreeView
中组织一组Object
(MyPlugin
)。实际上,我使用以下方法将它们添加到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
列表 .我想按名为 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);
- 如果我想保留我以前的代码,我不知道我将向每个类别添加多少个插件,所以我无法使用具有固定尺寸的
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]);
}
}