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