在循环中删除控件会导致奇怪的行为
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);
}
}
当我尝试删除所有动态分配的按钮时,我遇到了一些奇怪的行为。
我给这些按钮中的每一个都取了与 "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);
}
}