我有一個父級和子級節點的樹視圖控件,每個節點都有一個複選框,用於在選擇後選擇節點,如果我單擊刪除按鈕我想要刪除孩子或家長所選擇的,我使用以下代碼,並返回一個錯誤刪除選定的父節點和子節點 - 集合已被修改;枚舉操作可能不會執行
代碼
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);
}
}
}
錯誤
集合已修改;枚舉操作可能不會執行。
修改後的代碼
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;
}
}
}
解決方案
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]);
}
}
發現解決方案,問題是由於通用列表正在使用,我已經用正確的代碼更新了帖子 – sudheshna