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

时间:2017-12-21 13:51:49

标签: c# button controls

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

我给每个按钮的名称与" 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

依此类推,直到他们都消失了。

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

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

1 个答案:

答案 0 :(得分:4)

您在循环时修改集合。某些集合类型(如List<T>)具有内置&#34;保护&#34;对此,在下一次迭代中抛出一个异常,但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);
    }
}