关闭CheckChanged事件上的表单

时间:2014-05-30 02:42:16

标签: c# foreach invalidoperationexception

我有这段代码,在选中此框时打开一个表单,然后在取消选中该框时关闭它:

private void chkDupe_CheckedChanged(object sender, EventArgs e)
{  
    if (chkDupe.Checked == true)
    {
        input = 1;
        CableID_Controller.ShowDuplicateView(Main_Menu, this);
    }
    else if (chkDupe.Checked == false)
    {
        // Close form.
        FormCollection fc = Application.OpenForms;
        foreach (Form frm in fc)
        {
            if (frm is CableID_DuplicateView)
            {
                frm.Close();
            }
        }
    }
}

它打开表单很好,但是当我取消选中该框时,我收到错误:

  

出现InvalidOperationException 即可。收藏被修改;枚举可能无法执行。

我知道这与foreach循环有关,但我无法想出用其他东西替代它的方法。任何人都可以提供任何建议吗?

1 个答案:

答案 0 :(得分:1)

您在迭代时正在修改Application.OpenForms集合。您需要先创建一个副本,然后迭代该副本而不是原始集合

var fc = Application.OpenForms.OfType<Form>().ToList();

此外,如果您只想关闭CableID_DuplicateView表单,可以使用:

var fc = Application.OpenForms.OfType<CableID_DuplicateView>().ToList();

foreach (Form frm in fc)
      frm.Close();

并从循环中删除类型检查。