Как можно легко перебрать все узлы TreeView, изучить их свойство .Checked, а затем удалить все проверенные узлы?
Это кажется простым, но вы не должны изменять коллекцию, через которую вы выполняете итерацию, исключая возможность цикла "foreach". (Вызов .Nodes.Remove изменяет коллекцию.) Если это сделать, то эффект состоит в том, что удаляется только около половины узлов .Checked.
Даже если использовать два прохода: сначала создать список временных индексов, а затем удалить по индексу на втором проходе - индексы будут меняться при каждом удалении, нарушая целостность списка индексов.
Итак, какой самый эффективный способ сделать это?
Вот пример кода, который выглядит хорошо, но на самом деле удаляет только примерно половину .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);
}
}
}
(Да, намерение состоит только в том, чтобы обрезать узлы из дерева, которое имеет глубину в два уровня.)