0

我有一个 WinForms 应用程序,带有登录表单和主表单。登录表单包含两个供用户输入凭据的文本框、一个确定按钮和一个取消按钮。以下代码是 OK 按钮的事件处理程序:

        private void button_OK_Click(object sender, EventArgs e)
        {
            if (authenticated())
            {
                this.Close();
                Application.Run(new MainWindow());
            }
            else
            {
                MessageBox.Show("Incorrect credentials", "Retail POS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }    
        }

这样做的问题是,当主窗体打开时,它会保留登录对话框。我试图通过调用ShowDialog()from将登录表单显示为模式对话框来完成所需的行为Program.cs,但这并没有实现所需的行为。

请注意,主窗体有一个注销选项。也就是说,它应该删除主表单并再次显示登录表单。

Program.cs 代码:

static void Main()
{
    LoginForm loginForm = new LoginForm();
    loginForm.ShowDialog();
}

这会产生一个错误,表示无法启动第二个消息循环。

4

1 回答 1

1

你需要隐藏你的拳头。你可以这样做this.Hide()

小心你的位置this.Hide()

如果您正在使用mainForm.Show();,您可以将它放在它之前或之后,但如果使用mainForm.ShowDialog();您只能将它放在它之前,因为ShowDialog()停止执行代码,直到调用此方法的表单关闭。

program.cs你开始你的应用程序Application.Run(YourMainForm)

由于您希望LoginForm在打开应用程序时成为第一个,因此您应该在内部创建它Program.cs并像这样在内部传递它Application.Run()

...
LoginForm lf = new LoginForm();
...
Application.Run(lf);

现在我们已经LoginForm展示了。我们无法关闭它,因为我们的应用程序将关闭(因为它是主窗体)

因此,当用户登录并按下按钮并成功时,我们隐藏我们的主表单并显示我们想要的其他表单,如下所示:

private void button_OK_Click(object sender, EventArgs e)
{
    if (authenticated())
    {
        MainWindow mw = new MainWindow();
        mw.Show();
        this.Hide();
    }
    else
    {
        MessageBox.Show("Incorrect credentials", "Retail POS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
}

现在我们有我们的MainForm显示和登录隐藏。

由于您想让用户可以注销,您可以通过两种方式进行操作:

首先是当用户按下按钮时,我们这样做:

LoginForm lf = new LoginForm();
lf.Show();
this.Close(); //We assume that button is placed in your main form

这样我们再次显示登录表单(此时我们在内存中有 2 个登录表单,主表单和新表单,这是浪费内存),用户可以再次登录。这样,每次用户注销时,您LoginForm的内存中都会多出一个,这非常糟糕。

其他有效的方法是在Program.cs文件内部我们不在函数LoginForm内部创建实例Main(),而是在外部创建实例并将其标记为public static

它看起来像这样:

Program.cs

...
static class Program
{
    ...
    public static LoginForm mainForm;

    static void Main()
    {
        ....
        mainForm = new LoginForm();
        Application.Run(mainForm);
    }
}

现在,当我们有这个并且用户按下Logout时,您MainWindow不需要创建新实例,LoginForm但您可以只Show()使用现有(主)实例Program.mainForm.Show()

于 2020-01-25T08:10:46.250 回答