2009-05-05 14 views
7

TreeView内のすべてのノードを簡単に反復処理し、その.Checkedプロパティを調べて、チェックされたノードをすべて削除するにはどうすればよいですか?ツリービューからチェック項目を効率的に削除するには?

これは簡単ですが、反復処理中のコレクションを変更することは想定されていないため、「foreach」ループの可能性は排除されます。 .Nodes.Remove呼び出しはコレクションを変更しています。これを試みると、.Checkedノードの約半分だけが削除されます。

2つのパスを使用する場合でも、最初に一時インデックスのリストを作成し、2回目のパスでインデックスを削除すると、インデックスが削除されるたびにインデックスが変更され、インデックスリストの整合性が失われます。

これを行う最も効率的な方法は何ですか?ここで

は良く見えるそのコードの例ですが、実際にのみ.checkedをノードの約半分を取り除く:

  foreach (TreeNode parent in treeView.Nodes) 
      { 
       if (parent.Checked) 
       { 
        treeView.Nodes.Remove(parent); 
       } 
       else 
       { 
        foreach (TreeNode child in parent.Nodes) 
        { 
         if (child.Checked) parent.Nodes.Remove(child); 
        } 
       } 
      } 

(はい、意図が2つだけあるツリーからノードを剪定することです

答えて

6

これは、それらを列挙した後、ノードを削除し、ノードのn階層のために再帰的に使用することができます。

void RemoveCheckedNodes(TreeNodeCollection nodes) 
{ 
    List<TreeNode> checkedNodes = new List<TreeNode>(); 

    foreach (TreeNode node in nodes) 
    { 
     if (node.Checked) 
     { 
      checkedNodes.Add(node); 
     } 
     else 
     { 
      RemoveCheckedNodes(nodes.ChildNodes); 
     } 
    } 

    foreach (TreeNode checkedNode in checkedNodes) 
    { 
     nodes.Remove(checkedNode); 
    } 
} 
1

未チェックの項目の新しいリストを作成し、ツリービューをその新しいリストに再バインドすることができます(古いものを破棄します)。

7

ノードを後方に向かって歩いてみてください。そうすれば、あなたのインデックスは、あなたのノードサイズを超えて増加しない:

 
for(int ndx = nodes.Count; ndx > 0; ndx--) 
{ 
    TreeNode node = nodes[ndx-1]; 
    if (node.Checked) 
    { 
    nodes.Remove(node); 
    } 
    // Recurse through the child nodes... 
} 
+0

これは最も効率的な方法です。 – Romias

+0

古い質問ですが、これは最も効率的な方法です。 – TimFoolery

+0

これを見直してください...いくつかの変更を加えると少し速くなります... forループの見出しで以下の変更を行います: 'int ndx = nodes.Count-1'と' ndx> = 0'はあなたにループを通過するたびに発生する-1を回避します。物事の壮大な計画では、いくつかの余分な減算はまったく意味がありませんが、ちょっと...どうしてですか? – TimFoolery

3

効率的に実行したい場合は、チェックされているノードをチェックしながらそのノードを追跡する必要があります。チェックされたツリーノードをリストに格納します(チェックを外すと削除されます)。

あなたがユニークな鍵と多くのノードを管理しているとすれば、あなたも辞書と考えるかもしれません。しかし、あなたが10-50だけを扱っているなら、おそらく大きな違いはありません。

次に、ツリー全体をループするのではなく、あなたの(小さい)ノードのリストをループするだけです。

関連する問題