1

可能重复:
C# 没有像我说的那样处理控件

我用它来删除我在 Winform 上创建的所有图片框

foreach (PictureBox pb in this.Controls)
{
    pb.Dispose();
}

但每次只有大约一半的图片框被丢弃,另一半保持不变

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

4

3 回答 3

6

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

您可以通过使用反向 for 循环或创建一个包含引用的单独数组来解决此问题。

解决方案 #0

for (int i = Controls.Count - 1; i >= 0; i--)
{
    Controls[i].Dispose();
}

解决方案#1

foreach (var control in Controls.Cast<Control>().ToArray())
{
    control.Dispose();
}
于 2012-09-12T10:02:50.087 回答
0

尝试:

foreach(Control c in this.Controls)
{
  if(c is PictureBox) 
  {
   c.Dispose();
   this.Controls.Remove(c);
  }
} 
于 2012-09-12T09:37:28.753 回答
0

因为您有不是 a 的控件,所以PictureBox当循环到达此控件时,您的循环将引发异常。像这样修复你的循环:

foreach (PictureBox pb in this.Controls.OfType<PictureBox>().ToArray())
{
    pb.Dispose();
    this.Controls.Remove(pb);
}
于 2012-09-12T09:37:57.447 回答