删除循环中的控件会导致奇怪的行为

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除循环中的控件会导致奇怪的行为相关的知识,希望对你有一定的参考价值。

当我尝试删除所有动态分配的按钮时,我有一些奇怪的行为。

我给每个按钮命名与“dynamicButton”相同

for (int i = 0; i < 10; i++)
{
    foreach (Control item in Controls.OfType<Control>())
    {
         if (item.Name.Contains("dynamicButton"))
             {
                 Controls.Remove(item);
             }
    }
}

注意它循环了10次(虽然6或7就足够了)。下面我将向您展示它是如何做到的。

At i=0

At i=1

At i=2

At i=3

等等直到它们全部消失。

如图所示,我在这个东西里面做了很多不必要的循环,并且由于某种原因,即使我使用相同的参数,它也没有全部用完......

任何人都知道为什么会这样吗?

答案

您在循环时修改集合。一些集合类型(如List<T>)对此具有内置的“保护”,在下一次迭代中抛出异常,但ControlCollection显然没有。

假设您在元素#4处并将其删除 - 元素#5将移至#4,导致其被跳过。

你可以扭转循环,即:

for (int i = Controls.Count - 1; i >= 0; i--)
{
    Control item = Controls[i];
    if (item.Name.Contains("dynamicButton"))
    {
        Controls.RemoveAt(i);
    }
}

以上是关于删除循环中的控件会导致奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

React 中的 SVG 平移会导致奇怪的行为

ExtJS 4 奇怪的树加载行为

循环和便利方法是不是会导致 ARC 出现内存峰值?

switch 语句中的奇怪行为

带有 reloadData 的 AKPickerView 会导致奇怪的行为

ViewPager2 无法动态添加删除片段