注销功能引发错误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();
}
}
}
问题是您正在对其进行迭代的容器的元素调用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();
}