关闭除C#主菜单以外的所有打开表单

Rya*_*ant 13 c# winforms

尝试关闭除主菜单之外的所有表单

FormCollection formsList = Application.OpenForms;
Run Code Online (Sandbox Code Playgroud)

用一个foreach循环说,

if (thisForm.Name != "Menu") thisForm.Close();
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,它跳过菜单,然后关闭第一个,但然后错误:

收集被修改; 枚举操作可能无法执行

并停止.我已经尝试了几个地方,并且他们都说这个foreach循环是这样做的方式,并且特别令人讨厌,因为我在关闭表单后没有更新表单列表,我认为这可能有效.我唯一能想到的就是从后面开始,用一段时间前进.

Tre*_*ott 57

如果使用foreach枚举集合,则在迭代期间无法修改(添加或删除项目).尝试将对表单的引用复制到另一个集合,然后通过迭代该集合来删除它们.

在这种情况下,您可以使用列表或简单数组,例如:

List<Form> openForms = new List<Form>();

foreach (Form f in Application.OpenForms)
    openForms.Add(f);

foreach (Form f in openForms)
{
    if (f.Name != "Menu")
        f.Close();
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用for循环:

for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
    if (Application.OpenForms[i].Name != "Menu")
        Application.OpenForms[i].Close();
}
Run Code Online (Sandbox Code Playgroud)

或者,我的新的和当前最喜欢的,你可以使用Reverse()方法:

foreach (Form f in Application.OpenForms.Reverse())
{
    if (f.Name != "Menu")
        f.Close();
}
Run Code Online (Sandbox Code Playgroud)

  • 其他人注意 - 反向似乎不适用于.NET framework 4. (5认同)