从主窗体注销并在C#中显示登录窗体



我设计了一个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();

最新更新