Come si può facilmente iterare attraverso tutti i nodi in un TreeView, esaminare la loro proprietà .Checked e quindi eliminare tutti i nodi controllati?Come eliminare in modo efficiente gli elementi controllati da un TreeView?
Sembra semplice, ma non si dovrebbe modificare una raccolta attraverso cui si sta iterando, eliminando la possibilità di un ciclo "foreach". (La chiamata .Nodes.Remove sta modificando la collezione.) Se ciò viene tentato, l'effetto è che solo la metà dei nodi .Checked viene rimossa.
Anche se si dovessero utilizzare due passaggi: prima creando un elenco di indici temporanei e quindi rimuovendo per indice sul secondo passaggio, gli indici cambiano ad ogni rimozione, invalida l'integrità della lista di indici.
Quindi, qual è il modo più efficiente per farlo?
Ecco un esempio di codice che sembra buono, ma in realtà rimuove solo circa la metà dei nodi .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);
}
}
}
(Sì, l'intenzione è solo per potare i nodi da un albero che è due livelli profondi.)
Questo è il metodo più efficiente. – Romias
Vecchia domanda, ma +1 perché questo è il metodo più efficiente. – TimFoolery
Rivisitando questo ... alcune modifiche lo renderebbero un po 'più veloce ... apportando le seguenti modifiche all'intestazione del ciclo: 'int ndx = nodes.Count-1' e' ndx> = 0' ti permetteranno per evitare il -1 che si verifica in ogni passaggio attraverso il ciclo. Nel grande schema delle cose, alcune sottrazioni extra non significheranno molto, ma ehi ... perché no? – TimFoolery