foreach控制c#跳过控件

我有以下循环来删除我的C#Windows窗体应用程序中的按钮。 唯一的问题是它会跳过其他所有按钮。 如何从表单中删除所有按钮控件?

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

我认为这种方式更具可读性:

 var controlsToRemove = Controls.OfType 

调用ToArray()会创建一个新的具体集合,以便您可以枚举一个并修改另一个。

感到惊讶的是,你没有错误,因为你正在迭代它时修改集合。 使用for循环并从结尾开始:

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

(从最后开始,因为否则您将在迭代时更改每个控件的索引。)

你正在从你移除的同一个集合中迭代。 使用此代码:

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

而已! 希望我帮忙!