I have control over a tree with one level of parent and child nodes, each node has a checkbox for selecting nodes after selection, if I click the delete button. I want to remove the child or parent that has ever been selected, I use the following code and it returns an error
the code
protected void btnRemoveOrganisation_Click(object sender, EventArgs e) { foreach (TreeNode Item in tvwSelectedOrganisations.CheckedNodes) { if (Item.Parent == null) { foreach (TreeNode ChildNode in Item.ChildNodes) { Item.ChildNodes.Remove(ChildNode); } tvwSelectedOrganisations.Nodes.Remove(Item); } else { Item.Parent.ChildNodes.Remove(Item); } } }
Error
The collection has been modified; enumeration operation cannot be performed.
Modified code
protected void btnRemoveOrganisation_Click(object sender, EventArgs e) { TreeNodeCollection SelectedNodes = tvwSelectedOrganisations.CheckedNodes; foreach (TreeNode Item in SelectedNodes) { if (Item.Parent == null) { tvwSelectedOrganisations.Nodes.Remove(Item); } else { tvwSelectedOrganisations.FindNode(Item.Parent.ValuePath).ChildNodes.Remove(Item); } if (SelectedNodes.Count == 0) { break; } } }
Decision
int SelectedCount = SelectedNodes.Count; for (int i = SelectedCount - 1; i >= 0; i--) { if (tvwSelectedOrganisations.CheckedNodes[i].Parent == null) { int j = tvwSelectedOrganisations.CheckedNodes[i].ChildNodes.Count; tvwSelectedOrganisations.Nodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); i += j; } else { tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ShowCheckBox = false; tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ChildNodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); } }
source share