Небольшая ошибка в моей системе входа - PullRequest
1 голос
/ 24 января 2010

У меня небольшая проблема с моей простой системой входа в систему. это код

   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-строки', но когда она достигает следующей строки, приложение windows form начинает перемещаться со своей позиции и ждет нового нажатия кнопки входа в систему, прежде чем решит закрыть себя и перейти к следующему приложению или остаться на месте из-за неправильной комбинации кода пользователя и пароля.

как я могу это исправить? Btw. это .net, C # Я не хочу, чтобы приложение форм перемещало 1 позицию слева направо и запрашивало новое действие щелчка.

Ответы [ 3 ]

2 голосов
/ 24 января 2010

Вы звоните 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, это вскоре приведет к конфликту имен.

0 голосов
/ 25 января 2010

Копа изменений. Как упоминалось ранее, вы дважды вызываете 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) 
     }
 }
0 голосов
/ 24 января 2010

Лучшим подходом будет использование события 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...