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レベルの深さのツリーからノードをプルーニングすることだけです。)