我想按类别在Object
中组织一组MyPlugin
(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);
如果我想保留以前的代码,我不知道我将向每个类别添加多少个插件,因此无法使用固定尺寸的
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/