难以正确显示 "login" 和 "main" 表格

Difficulty displaying "login" and "main" forms correctly

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

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

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

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

Program.cs代码:

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

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

你需要隐藏你的拳头。你可以用 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 文件中我们不在 Main() 函数内部创建 LoginForm 实例,而是在外部创建实例并将其标记为 public static

看起来像这样:

Program.cs

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

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

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