难以正确显示 "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()
我有一个 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()