c# - 在 C# 中关闭除主菜单之外的所有打开的窗体

标签 c# winforms

尝试使用

关闭除主菜单以外的所有窗体
FormCollection formsList = Application.OpenForms;

用一个 foreach 循环并说,

if (thisForm.Name != "Menu") thisForm.Close();

工作正常,它跳过菜单,并关闭第一个菜单,但随后出现错误:

Collection was modified; enumeration operation may not execute

然后停下来。我已经尝试了几个地方,他们都说这个 foreach 循环是这样做的方法,这特别烦人,因为我在关闭表单后没有更新我的表单列表,我认为这可能有效。我唯一能想到的就是从后面开始,用一段时间向前。

最佳答案

如果您使用 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();
}

或者您可以使用 for 循环:

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

或者,我现在最喜欢的,你可以使用 Reverse() 方法:

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

关于c# - 在 C# 中关闭除主菜单之外的所有打开的窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9029351/

相关文章:

c# - 找不到字段 : 'NHibernate.NHibernateUtil.String'

c# - 数据表单元格可以包含数据表吗?

c# - 我的类(class)有 30 个属性,单元测试很痛苦不是吗?

javascript - 从文件系统在 webbrowser 控件中加载 jQuery

c# - 我可以保存 ObservableCollection 的内容,以便在我重新启动我的应用程序时列表仍然完好无损吗?

c# - 在表单最小化时在任务栏中显示进度条

vb.net - 隐藏左列DataGridView

.net - 为什么 .NET winform 在大 DPI 设置下无法正确缩放?

c# - 如何使用 C# 在列表框中列出类对象?

c# - WindowsPrincipal.IsInRole() 未返回预期结果