注销功能抛出错误C#winform

时间:2013-06-21 05:35:02

标签: c# winforms logout

我有一个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();
                }
            }
        }

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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;
            }
        }

答案 2 :(得分:0)

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

foreach (var form in this.OwnedForms)
{
    form.Close();
}