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つだけあるツリーからノードを剪定することです
これは最も効率的な方法です。 – Romias
古い質問ですが、これは最も効率的な方法です。 – TimFoolery
これを見直してください...いくつかの変更を加えると少し速くなります... forループの見出しで以下の変更を行います: 'int ndx = nodes.Count-1'と' ndx> = 0'はあなたにループを通過するたびに発生する-1を回避します。物事の壮大な計画では、いくつかの余分な減算はまったく意味がありませんが、ちょっと...どうしてですか? – TimFoolery