2

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

// を使用しているので、 for eachTagを節約できますMyPlugin TypeNode

そして、これは私TreeViewが a からmy を取り込むために使用している方法です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リストを含む単純なものを表示することですMyPluginCategory( )というプロパティで分類したいと思います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);
  1. 以前のコードを保持したい場合、各カテゴリに追加するプラグインの数がわからないため、Array固定サイズの を使用できません...
  2. コンストラクタがしか受け付けず、メソッドがしか受け付けないListので使えない…TreeNodeArrayTreeView.Nodes.AddTreeNode

どうすればできますか?

4

1 に答える 1

1

ノードを作成しながら、その場でカテゴリの辞書を作成します。後で、これらのノードのみをツリーに追加します。手順は次のとおりです。

そのような辞書を宣言します

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]);
    }
}
于 2012-06-14T13:12:38.857 に答える