6

C# Windows フォーム アプリケーションでボタンを削除する次のループがあります。唯一の問題は、他のすべてのボタンをスキップすることです。フォームからすべてのボタン コントロールを削除するにはどうすればよいですか?

foreach (Control cntrl in Controls)
{
    if(cntrl.GetType() == typeof(Button))
    {
        Controls.Remove(cntrl);
        cntrl.Dispose();
    }
}
4

3 に答える 3

12

この方法はもう少し読みやすいと思います:

var controlsToRemove = Controls.OfType<Button>().ToArray();
foreach (var control in controlsToRemove)
{
    Controls.Remove(control);
    cntrl.Dispose();
}

を呼び出すToArray()と、新しい具体的なコレクションが作成されるため、一方を列挙して他方を変更できます。

于 2013-07-13T04:48:42.990 に答える
2

コレクションを繰り返し処理しているときにコレクションを変更しているので、エラーが発生していないことに驚いています。forループを使用して、最後から開始します。

for (int ii = Controls.Count - 1; ii >= 0; ii--)
{
    Control cntrl = Controls[ii];
    Controls.remove(cntrl);
    cntrl.Dispose();
}

(そうしないと、繰り返しながら各コントロールのインデックスを変更することになるため、最後から始めます。)

于 2013-07-13T04:45:14.697 に答える
0

削除する同じコレクションを繰り返し処理しています。次のコードを使用します。

    List<Control> cleanControls = new List<Control>();
    foreach(Control ctr in Controls)
    {
       if(cntrl.GetType() != typeof(Button))
       {
          cleanControls.Add(ctr);
       }
       else
       {
         ctr.Dispose();
       }
    } 
    Controls = cleanControls;

それでおしまい!私が助けてくれることを願っています!

于 2013-07-13T04:52:38.177 に答える