C# 我的登录系统中有一个小错误

C# 我的登录系统中有一个小错误,c#,.net,winforms,login,C#,.net,Winforms,Login,我的简单登录系统有点问题。 这是密码 static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); bool loginSuccessful

我的简单登录系统有点问题。 这是密码

   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()
两次。那可不好

不要将结果存储在两个变量(
loginsucessful
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

让身份验证系统返回
对话框result
以指示身份验证成功似乎是不对的。这些值与按下的按钮有关

您尚未向我们展示此代码的上下文,但我敢打赌它不安全。大多数经验丰富的程序员(包括我自己)都在与安全性作斗争。让一个有经验的程序员来做这件事会带来灾难


当我这样做时,我会用
dialog
命名一个dialog类,如
LoginDialog
中所示。将其称为登录将很快导致名称冲突。

更好的方法是在登录对话框中使用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());
    }
}

变化的Cople。如前所述,您将调用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) 
     }
 }

Jay thx为您输入!我只是一个初学者和学习者,我立即测试了它,当然,wé就快到了如果我启动程序并输入正确的用户名/密码组合,一切都会很好!表单关闭自身并启动第二个表单-如果我输入nonsens,它将在另一个位置重新关闭自身,无论我输入的组合是否正确,表单都将保持在它的位置:(它不显示第二个表单,也不关闭自身我如何更改代码