使用foreach循环删除Winform上的所有控件

Big*_*igM 1 c# foreach dispose winforms

可能重复:
C#Not Disposing控件就像我告诉它的那样

我用它来删除我在Winform上创建的所有Picturebox

foreach (PictureBox pb in this.Controls)
{
    pb.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

但每次只有大约一半的所有Picturebox被处理掉,另一半仍未触及

我用一个while (Controls.OfType<PictureBox>().Count() > 0 )循环来解决它,所以它只是被执行,直到所有的Picturebox都消失了,但这是一个糟糕的解决方案,我想知道为什么会发生这种情况以及我如何以正确的方式解决它

Pao*_*tti 6

Control.Dispose 从集合中删除控件,更改索引并弄乱foreach.

您可以通过使用reverse for循环或通过创建包含引用的单独数组来解决此问题.

解决方案#0

for (int i = Controls.Count - 1; i >= 0; i--)
{
    Controls[i].Dispose();
}
Run Code Online (Sandbox Code Playgroud)

解决方案#1

foreach (var control in Controls.Cast<Control>().ToArray())
{
    control.Dispose();
}
Run Code Online (Sandbox Code Playgroud)