我有一个树视图控件,父节点和子节点的一个级别,每个节点都有一个复选框选择后选择节点,如果我点击删除按钮,我想删除子或父什么被选中,我使用以下代码,它返回一个错误
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);
}
}
}
误差Collection被修改;不能执行枚举操作。
<<p> 修改代码/strong> 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;
}
}
}
<<p> 解决方案/strong> 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]);
}
}
希望您使用的是。net 3.5或更高版本。
foreach (TreeNode ChildNode in Item.ChildNodes.ToList())
{
Item.ChildNodes.Remove(ChildNode);
}
编辑
如果项目。ChildNodes不可枚举。
for( int i = Item.ChildNodes.Count - 1; i >= 0; i-- )
{
Item.ChildNodes.Remove(ChildNode);
}
或
while (Item.ChildNodes.Count > 0)
{
Item.ChildNodes.Remove(ChildNode);
}
这一行不能放在foreach中,因为您正在修改枚举的集合:
tvwSelectedOrganisations.Nodes.Remove(Item);
相反,构建要删除的项的新列表,然后遍历该列表并删除现有foreach
之外(和之后)的项。
肯定会抛出异常。你不应该通过在同一个集合中循环来delete
或remove
一个集合中的项。相反,将集合Item.ChildNodes
复制到一个空的新集合中,尝试在原始集合中循环并删除新集合中想要的项目,在循环作用域之外再次循环后,将修改后的集合重新分配给原始集合。