1

我设计了一个 pos 软件。这是一个 3 表单登录表单,pos_authority 表单,pos_user 表单。在 pos_authority 和 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);
        }
    }

这里显示异常集合被修改;枚举操作可能无法执行。

4

3 回答 3

1

Application.OpenForms 在运行时获取所有打开的表单,但是如果您关闭一个打开的表单(进而将其从 OpenForm 中删除),foreach 语句将向您抛出异常,说明集合已更改,这是真的。

要解决此类问题,您可以将打开的表单存储到列表中:

Application.OpenForms.Cast<Form>().ToList()

或以相反的方式遍历集合 - 从最后一个到第一个。

编辑:

为了摆脱异常,用 替换你foreach (Form f in Application.OpenForms)foreach (Form f in Application.OpenForms.Cast<Form>().ToList()),我没有测试它,但它应该在理论上有效。

但是我认为即使您更正了异常,它也不会正常工作-如果打开的表单不止一个,您最终会显示许多登录表单。我建议您检查您的整个设计并尝试使用事件 - 您知道 Windows 窗体是事件驱动的!

于 2013-08-30T05:39:01.937 回答
0

在您的登录表单中试试这个;

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

基本上,您(从登录表单)监听另一个表单的表单关闭事件,当它发生时,您再次显示登录表单。为我的程序工作。

于 2013-08-30T05:38:33.503 回答
0

您的例外是因为您正在调用f.Close()which deletes de form,更改了在 foreach 中循环的集合,因此无法继续循环。

我认为你应该改变你的代码:

new login_Form().Show();

至:

login_Form.Show();
于 2013-08-30T05:39:30.143 回答