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

Removing controls in a loop results in a strange behaviour

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

我给这些按钮中的每一个都取了与 "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>)有内置的 "protection" 反对这个,在下一次迭代时抛出异常,但 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);
    }
}