1

重複の可能性:
C#は、私が言ったようにコントロールを破棄しません

これを使用して、Winform で作成したすべての Pictureboxes を削除します

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

ただし、すべての Picturebox の約半分だけが破棄されるたびに、残りの半分はそのまま残ります。

ループで囲むことで解決した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

ではないコントロールがあるためPictureBox、ループがこのコントロールに到達すると例外がスローされます。ループを次のように修正します。

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