删除选定的父节点和子节点 - 修改了集合; 枚举操作可能无法执行

sud*_*hna 6 .net c# asp.net treeview nodes

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

    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);
            }

        }

    }
Run Code Online (Sandbox Code Playgroud)

错误

收集被修改; 枚举操作可能无法执行.

修改代码

        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;
                }

            }

        }
Run Code Online (Sandbox Code Playgroud)

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]);

                }

            }
Run Code Online (Sandbox Code Playgroud)

Cha*_*thJ 4

希望您使用 .Net 3.5 或更高版本。

foreach (TreeNode ChildNode in Item.ChildNodes.ToList())
{
    Item.ChildNodes.Remove(ChildNode);
}
Run Code Online (Sandbox Code Playgroud)

编辑

如果 Item.ChildNodes 不是Enumerable。那就试试下面吧。

for( int i = Item.ChildNodes.Count - 1; i >= 0; i-- )
{
    Item.ChildNodes.Remove(ChildNode);
}
Run Code Online (Sandbox Code Playgroud)

或者

while (Item.ChildNodes.Count > 0)
{
    Item.ChildNodes.Remove(ChildNode);
}
Run Code Online (Sandbox Code Playgroud)