我的简单登录系统有一点问题。 这是代码
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
bool loginSuccessful;
bool loginRetry;
using (Login login = new Login())
{
loginSuccessful = (login.ShowDialog() == DialogResult.OK);
loginRetry = (login.ShowDialog() == DialogResult.Retry);
if (loginSuccessful)
{
Application.Run(new Form1());
}
if (loginRetry)
{
Application.Run(new Login());
}
}
}
}
它可以工作,但是从这两行开始有一个小问题:
loginSuccessful = (login.ShowDialog() == DialogResult.OK);
loginRetry = (login.ShowDialog() == DialogResult.Retry);
首先,程序到达“登录成功行”,但是当到达下一行时,Windows 窗体应用程序开始从其位置移动,并等待重新单击登录按钮,然后决定关闭自身并继续前进下一个表单应用程序或由于错误的用户代码/密码组合而留在原处。
我该如何解决这个问题?顺便提一句。这是.net,C# 我不希望表单应用程序从左向右移动 1 个位置并请求新的单击操作。
您拨打了
ShowDialog()
两次。这可不太好。
不要将结果存储在两个变量中(
loginSuccessful
,loginRetry
),因为那样你就会在两个地方存储相同的信息。 尝试一下:
switch (login.ShowDialog())
{
case DialogResult.OK:
Application.Run(new Form1());
return;
case DialogResult.Retry:
Application.Run(new Login());
return;
default:
throw new Exception("unexpected dialog result");
}
我认为你不应该在嵌套上下文中调用
Application.Run()
,但我没有这方面的硬数据。 也许会循环 login.ShowDialog()
直到返回 OK。
认证系统返回
DialogResult
来表示认证成功似乎不太正确。这些值与按下的按钮有关。
您还没有向我们展示这段代码的上下文,但我敢打赌它不安全。大多数经验丰富的程序员都在与安全性作斗争(包括我自己)。让经验丰富的程序员来做这件事会带来灾难。
当我这样做时,我会用
Dialog
命名一个对话框类,如 LoginDialog
所示。叫它Login
很快就会导致名称冲突。
更好的方法是在登录对话框中使用 FormClosing 事件,如果 DialogResult 是 DialogResult.OK 并且用户可能未经过身份验证,请将 e.Cancel 属性设置为 true,这样您就不必创建登录的新实例对话框不会调用 ShowDialog 两次,因为它在关闭时被释放。
在登录对话框中:
private void Login_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.OK) {
// authenticate user
// if fails assign e.Cancel = true; to prevent login dialog to close
}
}
主体:
using (Login login = new Login())
{
if (login.ShowDialog() == DialogResult.OK) {
Application.Run(new Form1());
}
}
几个变化:如前所述,您调用 ShowDialog 两次,这就是您看到登录屏幕两次的原因。 支持重做。您需要某种循环来重复显示登录表单,直到用户输入正确的凭据。 您真正需要的是如下所示:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
DialogResult rc;
do
{
using (Login login = new Login())
{
rc = login.ShowDialog();
if (rc == DialogResult.OK)
{
Application.Run(new Form1());
}
}
}
while (rc == DialogResult.Retry)
}
}