从主窗体注销并在C#中显示登录窗体
本文关键字:窗体 显示 登录 注销 | 更新日期: 2023-09-27 18:29:32
我设计了一个pos软件。这是一个三表单一登录表单,pos_authority表单,pos_user表单。在pos_authenticaty和pos_user用户表单中有一个注销按钮。当我单击按钮时,我想从表单中注销并显示登录表单。当我登录时,我隐藏登录表单。这是我的代码
private void blogout_button_Click(object sender, EventArgs e)
{
try
{
foreach (Form f in Application.OpenForms)
{
if (f.Name != "login_form")
{
f.Close();
new login_Form().Show();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
这里显示异常集合已修改;枚举操作可能无法执行。
Application.OpenForms在运行时获取所有打开的表单,但是,如果您关闭一个打开的表单(从而将其从OpenForm中删除),foreach语句将向您抛出异常,说明集合已更改,这是真的。
为了解决这种问题,您可以将打开的表单存储到一个列表中:
Application.OpenForms.Cast<Form>().ToList()
或者反过来遍历集合——从最后一个遍历到第一个。
编辑:
为了消除这个异常,用foreach (Form f in Application.OpenForms.Cast<Form>().ToList())
替换你的foreach (Form f in Application.OpenForms)
,我没有测试它,但理论上它应该可以工作。
但我认为即使你纠正了异常,它也不会正常工作-如果有多个打开的表单,你最终会显示许多登录表单。我建议你回顾一下你的整个设计,并尝试使用事件-你知道windows表单是事件驱动的!
在登录表单中尝试此操作;
private void ButtonClick(object sender, EventArgs e)
{
Form aform = new Form();
aform.Show();
aform.FormClosing += FrmClosing;
Hide();
}
private void FrmClosing(object sender, FormClosingEventArgs e)
{
Show();
}
基本上,您(从登录表单)监听另一个表单的表单关闭事件,当它发生时,您将再次显示登录表单。对我的程序很有帮助。
您的异常是因为您正在调用f.Close()
,它删除了表单,更改了在foreach中循环的集合,因此无法继续循环。
我认为你应该更改你的代码从:
new login_Form().Show();
至:
login_Form.Show();