C# 如何创建winform登录对话框并保持循环

C# 如何创建winform登录对话框并保持循环,c#,.net,C#,.net,创建一个登录表单,如果凭据正确,该表单将进入主表单。以下是基本伪代码: ShowLoginForm() if (DialogResult == OK) CheckCredentials(); if (credentials == VALID) ShowMainForm(); else LoopBackAndShowLoginFormAgain(); //repeat process... else CloseLoginForm(); 然而,我对WinForm

创建一个登录表单,如果凭据正确,该表单将进入主表单。以下是基本伪代码:

ShowLoginForm()

if (DialogResult == OK)
  CheckCredentials();
  if (credentials == VALID)
    ShowMainForm();
  else
    LoopBackAndShowLoginFormAgain();  //repeat process...
else
  CloseLoginForm();
然而,我对WinForms还比较陌生,并且仍在摸索。我正试图决定将循环放在哪里(Main()或LoginForm中的某个地方)。我应该在哪里检查凭据?这就是我到目前为止所做的:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    LoginForm loginForm = new LoginForm();
    if (loginForm.ShowDialog() == DialogResult.OK)
    {
        Application.Run(new AutoSignerForm());
    }
}

我不想退出并重复打开登录表单(我在这里寻找一些效率,所以我想使用相同的登录对话框)。任何提示、提示或想法?

为什么不创建主窗体,然后显示登录模式对话框。然后您可以检查要做什么。

试试这个

LoginForm loginForm = new LoginForm();     
do {
   if (loginForm.ShowDialog() == DialogResult.Cancel) {
       return; // Ends application
   }
} while (CheckCredentials() != VALID)
Application.Run(new AutoSignerForm());

我会这样做:

  • 在Program.cs中,将loginForm显示为对话框

    LoginForm login_form = new LoginForm();
    if(login_form.ShowDialog() == DialogResult.OK) {
        Application.Run(new MainForm());
    }
    
  • 在LoginDialog中,处理“登录”按钮(或任何名称)上的单击事件

现在,您将一直显示LoginDialog,直到用户输入有效凭据或放弃尝试并关闭应用程序。这样,您将只有一个LoginForm实例,这将是一个很好的用户体验。
此外,您可以确保在用户未成功登录的情况下未初始化和显示MainForm。

在SubmitButton事件处理程序中将DialogResult设置为None如何?比如:

private void loginButton_Click(object sender, EventArgs e)
{
    if (isValidCredentials())
      DialogResult = DialogResult.OK;
    else
    {
      MessageBox.Show("Failed to login or some other error");
      DialogResult = DialogResult.None;
    }
}

如果登录失败,不显示新表单,如何处理提交按钮处理程序中的逻辑?如果凭证未签出,请清除用户名/密码字段,不要关闭表单。这也是我的想法。我不知道如何阻止关闭表单并将dialogResult返回到Main。在用户想要单击登录表单上的“取消”按钮之前,此操作一直有效。我想使它相对干净,而不是有一堆布尔值来进行检查。我相应地更改了我的示例。谢谢,所以您建议检查Main中的凭据而不是实际的loginForm?这只是一种可能性。当然,您可以检查登录表单中的凭据,并将其保持打开状态,直到用户输入有效凭据或单击
Cancel
。这完全不需要C#loop语句,并允许您在凭据无效时显示附加消息(例如,使不可见的标签可见)。请参见下面的我的答案。你刚才解释的正是我正在做的(我想)。我想使用可见标签也。感谢您的帮助。Show change my Main around以显示该应用程序。运行(new AutoSignerForm()),然后在表单_Load()中,我提出了一个loginDialog?这与我的想法完全相同,但是,我无法让它工作。我不确定有什么方法可以阻止表单关闭。代码显示一个消息框,然后表单关闭,然后显示主表单。您可能已经使用DialogResult.OK设置了“LoginButton”。您应该将其保留为DialogResult.None(默认属性),也不能将其设置为窗体的“AcceptButton”。请检查并重试好吗?如果(IsValidRedentials()){DialogResult=DialogResult.OK;Close()}或者{messageLabel.Visible=true;firstTextBox.Focus();},我会将其更改为
。在第二种情况下,不需要对话框结果,因为对话框窗体保持打开状态。仅在
Cancel按钮中单击
do
DialogResult=DialogResult.Cancel;Close()我做了更改,但由于某种原因,当我没有设置DialogResult=DialogResult时。在第二种情况下,它关闭我的表单。我没有在其他地方设置它。可能这会自动发生,因为
loginButton
是表单默认的接受按钮。在这种情况下,继续设置它
None
。答对了,我把它改回了None,效果非常好。但是,是否仍需要调用Close()?如果它工作正常,请不要更改它。(不要改变获胜的马!)
private void loginButton_Click(object sender, EventArgs e)
{
    if (isValidCredentials())
      DialogResult = DialogResult.OK;
    else
    {
      MessageBox.Show("Failed to login or some other error");
      DialogResult = DialogResult.None;
    }
}