Вопрос по c#, .net – Как создать диалог входа в Winform и продолжать цикл

3

Создание формы входа, которая затем перейдет к основной форме, если учетные данные верны. Вот основной псевдокод:

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());
    }
}

Я не хочу выходить из системы и открывать форму входа в систему несколько раз (здесь нужна некоторая эффективность, поэтому я хочу использовать тот же диалог входа в систему). Любые указатели, советы или идеи?

Это была такая же идея, как и у меня. Я не знал, как предотвратить закрытие формы и возвращение dialogResult обратно в Main. keelerjr12
Вместо отображения новой формы при сбое входа в систему, как насчет обработки логики в обработчике кнопки «Отправить»? Если учетные данные не проверяются, очистите поля имени пользователя и пароля и не закрывайте форму. itsme86

Ваш Ответ

4   ответа
0

Как насчет того, чтобы установить для DialogResult значение None в обработчике события SubmitButton? Что-то вроде:

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 = DialogResult. Во втором случае он закрывает мою форму. Я не установил его в другом месте. keelerjr12
Вероятно, это происходит автоматически, потому чтоloginButton является кнопкой подтверждения формы по умолчанию. Продолжайте устанавливать этоNone в этом случае.
Я бы изменил это наif (isValidCredentials()) { DialogResult = DialogResult.OK; Close() } else { messageLabel.Visible = true; firstTextBox.Focus(); }, Во втором случае диалог не требуется, так как форма диалога остается открытой. Только вcancelButton_Click делатьDialogResult = DialogResult.Cancel; Close();
Бинго, я вернул None, и он отлично работает. Тем не менее, мне все еще нужно вызвать Close ()? keelerjr12
Если он работает отлично, не меняйте его. (Не меняйте лошадь-победителя!)
2

Попробуй это

LoginForm loginForm = new LoginForm();     
do {
   if (loginForm.ShowDialog() == DialogResult.Cancel) {
       return; // Ends application
   }
} while (CheckCredentials() != VALID)
Application.Run(new AutoSignerForm());
Это работает до тех пор, пока пользователь не захочет нажать кнопку «Отмена» в форме входа. Я хотел сделать его относительно чистым и не иметь кучу логических значений для проверки. keelerjr12
Я изменил свой пример соответственно.
Спасибо, так что вы рекомендуете проверять учетные данные внутри Main вместо фактического loginForm? keelerjr12
Это только одна возможность. Конечно, вы можете проверить учетные данные в форме входа в систему и держать ее открытой, пока пользователь не введет действительные учетные данные или не нажметCancel, Это вообще не требует оператора цикла C # и позволяет показать дополнительное сообщение (например, сделав видимую невидимую метку), если, например, учетные данные недействительны.
Смотрите мой ответ ниже. То, что вы просто объясняете, это именно то, что я делаю (я думаю). Я хотел бы также использовать видимую метку. Спасибо за помощь. keelerjr12
14

Я бы сделал следующее:

  • in Program.cs show the loginForm as a dialog

    LoginForm login_form = new LoginForm();
    if(login_form.ShowDialog() == DialogResult.OK) {
        Application.Run(new MainForm());
    }
    
  • in LoginDialog, handle the click event on "Login" button (or whatever is named)

    // replace with the actual login
    if(textBoxUsername.Text == "my user" && textBoxPassword.Text == "my pass") {
       // save the user has logged in somewhere
       // set the dialog result to ok
       this.DialogResult = DialogResult.OK;
       // close the dialog
       this.Close();
    } else {
       // login failed
       MessageBox.show("Login failed");
       // do not close the window
    }
    

Теперь вы будете отображать LoginDialog до тех пор, пока пользователь не введет действительные учетные данные или не прекратит попытки, и приложение не закроется. Таким образом, у вас будет только один экземпляр LoginForm, и это будет приятным для пользователя. Кроме того, вы можете быть уверены, что MainForm не инициализируется и отображается без успешного входа пользователя.

Это была моя точная идея, однако я не смог заставить ее работать. Я не уверен, как предотвратить закрытие формы. С вашим кодом отображается MessageBox, а затем форма закрывается, а затем отображается основная форма. keelerjr12
Да, это была проблема, спасибо! keelerjr12
Возможно, вы установили & quot; LoginButton & quot; с DialogResult.OK. Вы должны оставить его как DialogResult.None (свойство по умолчанию), и вы также не можете установить его как & quot; AcceptButton & quot; к форме. Можете ли вы проверить это и попробовать еще раз?
1

почему бы не создать основную форму, а затем показать модальный диалог входа в систему. Тогда вы можете проверить, что делать.

Показать изменить мой Main, чтобы показать, что Application.Run (новый AutoSignerForm ()), а затем в Form_Load () я вызываю loginDialog? keelerjr12

Похожие вопросы