我的简单登录系统有点问题。 这是代码
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);
在第一次,程序到达'loginSuccessful-line',但是当它到达下一行时,windows表单应用程序开始从其位置移动并等待新的点击登录按钮,然后它决定关闭自己并且移动到下一个表单应用程序或由于错误的用户代码/密码组合而留在原位。
我该如何解决这个问题?顺便说一句。这是.net,C# 我不希望表单应用程序从左向右移动1个位置并要求新的单击操作。
答案 0 :(得分:2)
您正在拨打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
将导致名称冲突。
答案 1 :(得分:0)
更好的方法是在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());
}
}
答案 2 :(得分:0)
改变的人。如前所述,您将两次调用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)
}
}