2

我有一个需要注销功能的 Windows 应用程序。我不希望注销将应用程序扔到登录页面上,因为我没有登录页面。登录只是主页上的一个面板。

我已经尝试了以下代码,但它抛出了这个错误:

错误:集合被修改,枚举操作可能无法执行。

private void mnulogout_Click(object sender, EventArgs e)
        {
            DialogResult dialogresult=MessageBox.Show("Do You Want To LogOut?","LogOut",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dialogresult == DialogResult.Yes)
            {
                foreach (Form fm in Application.OpenForms)
                {
                    fm.Close();
                }
            }
        }
4

3 回答 3

1

问题是您正在调用Close您正在迭代的容器的元素。由于此容器仅包含打开的表单,因此当您调用该方法时,表单将从容器中删除Close,因此您在迭代期间更改了容器。C# 不喜欢这样。

要解决此问题,请创建容器的副本并迭代此副本:

List openFormsCopy = new List(Application.OpenForms);
foreach (Form fm in openFormsCopy)
{
    fm.Close();
}

请注意,这只回答了问题的 C# 部分。其他一些回答者建议您无论如何都在迭代错误的集合。我不熟悉 WinForms,所以我无法对此发表评论,但您可能想调查一下。

于 2013-06-21T06:34:11.363 回答
0

假设您正在尝试关闭父表单可能已打开的任何子表单,您应该使用this.OwnedForms而不是Application.OpenForms

foreach (var form in this.OwnedForms)
{
    form.Close();
}
于 2013-06-21T06:28:51.617 回答
0

如果您尝试显示/隐藏相同形式的面板,您可以使用它

private void mnulogout_Click(object sender, EventArgs e)
        {
            DialogResult dialogresult=MessageBox.Show("Do You Want To LogOut?","LogOut",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dialogresult == DialogResult.Yes)
            {                    
                loginPanel.Visible = true;
                OtherPanels.Visible = false;
            }
        }
于 2013-06-21T05:44:47.527 回答