C# 对象作为TreeView.Nodes.Add参数?

C# 对象作为TreeView.Nodes.Add参数?,c#,winforms,treeview,C#,Winforms,Treeview,我使用了一个CheckedListBox来显示插件的列表。我正在使用一个EventHandler: private void myCheckedListBox_SelectedIndexChanged(object sender, EventArgs e) { myGUIUtilities.SetDescription(myCheckedListBox.SelectedItem, myRichTextBox); } 要显示某些内容。。。 这是myGUIUtilities.SetDesc

我使用了一个
CheckedListBox
来显示
插件的
列表。我正在使用一个
EventHandler

private void myCheckedListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    myGUIUtilities.SetDescription(myCheckedListBox.SelectedItem, myRichTextBox);
}
要显示某些内容。。。 这是
myGUIUtilities.SetDescription
方法:

internal static void SetDescription(object p_SelectedObject, RichTextBox p_TextBoxDescription)
            {
                AbstractEnvChecker l_Plugin = p_SelectedObject as AbstractEnvChecker;
                if (l_Plugin != null)
                    p_TextBoxDescription.Text = l_Plugin.Description;
            }
为了显示我的插件,我只使用了
CheckedListBox.Items.Add
方法:

MyCheckedListBox.Items.Add(myPlugin)

接受对象作为参数的

现在我想按类别对我的
插件进行分类,所以我使用
TreeView
TreeNode

问题是
TreeView.Nodes.Add(TreeNode节点)
只接受
TreeNode
类型作为参数

实际上,我不能使用同样的
SetDescription
方法,它需要
Plugin
类型来获取
Plugin.Description
属性

是否有方法将对象传递给
TreeView.Nodes.Add(TreeNode节点)
方法? 或者另一种方法?

使用树节点上的属性将对象附加到树节点上。然后你可以稍后再把它拔出来

因此您可以这样做(假设插件对象上有
名称
属性)

然后您可以重写事件处理程序的开头,如下所示:

AbstractEnvChecker l_Plugin = p_SelectedObject as AbstractEnvChecker;
if(l_Plugin == null)
{
  TreeNode selNode = p_SelectedObject as TreeNode;
  if(selNode != null && selNode.Tag != null)
    l_Plugin = selNode.Tag as AbstractEnvChecker;
}
//might still be null in the future if you start using Tags for other types.

您可以创建自己的继承TreeNode的树节点类。继承的类可以具有对插件的强类型引用,而不是使用tag属性。我将此方法用于具有不同类型对象、自定义上下文菜单等的相当复杂的树状视图。

第一部分工作:
Tag=Plugin
。但是
l_插件
仍然是空的。。。变量
p\u SelectedObject
是一个简单的
字符串
而不是一个对象…我建议在单击节点时使用事件来处理-从已传递的中获取节点,然后将其传递给
SetDescription
方法我尝试过,但仍然
null
void treeView1\u NodeMouseClick(object sender,TreeNodeUseClickEventArgs e){GUIUtilities.SetDescription((TreeView)sender.SelectedNode,this.richTextBox1);}
下面是您建议的
SetDescription
方法:
内部静态无效SetDescription(object p\u SelectedObject,RichTextBox p\u TextBoxDescription){AbstractEnvChecker l_Plugin=p_选择对象作为AbstractEnvChecker;if(l_Plugin==null){TreeNode selNode=p_选择对象作为TreeNode;if(selNode!=null&&selNode.Tag!=null)l_Plugin=selNode.Tag作为AbstractEnvChecker;}
在事件处理程序中使用
e.Node
AbstractEnvChecker l_Plugin = p_SelectedObject as AbstractEnvChecker;
if(l_Plugin == null)
{
  TreeNode selNode = p_SelectedObject as TreeNode;
  if(selNode != null && selNode.Tag != null)
    l_Plugin = selNode.Tag as AbstractEnvChecker;
}
//might still be null in the future if you start using Tags for other types.