注销功能引发错误C#winform

本文关键字:错误 C#winform 功能 注销 | 更新日期: 2023-09-27 18:19:31

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

注销功能引发错误C#winform

问题是您正在对其进行迭代的容器的元素调用Close。由于此容器只包含打开的表单,因此在调用Close方法时,该表单将从容器中删除,因此在迭代过程中会更改容器。C#不喜欢这样。

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

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

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

如果你试图显示/隐藏相同形式的面板,你可以使用这个

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;
            }
        }

假设您试图关闭父窗体可能已打开的任何子窗体,则应该使用this.OwnedForms而不是Application.OpenForms:

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