删除选定的父节点和子节点-已修改集合;不能执行枚举操作



我有一个树视图控件,父节点和子节点的一个级别,每个节点都有一个复选框选择后选择节点,如果我点击删除按钮,我想删除子或父什么被选中,我使用以下代码,它返回一个错误

    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之外(和之后)的项。

肯定会抛出异常。你不应该通过在同一个集合中循环来deleteremove一个集合中的项。相反,将集合Item.ChildNodes复制到一个空的新集合中,尝试在原始集合中循环并删除新集合中想要的项目,在循环作用域之外再次循环后,将修改后的集合重新分配给原始集合。

最新更新