Как остановить выполнение программы Windows Form до ввода текстового поля? - PullRequest
0 голосов
/ 13 февраля 2019

Я создаю приложение Windows Form, которое хранит записи информации о сотрудниках в базе данных, включая SSN.Рядом с текстовым полем, где запрашивается ввод SSN, у меня есть флажок, который при щелчке показывает мне полный SSN вместо последних четырех цифр.Чтобы гарантировать, что только администратор имеет доступ к этой информации, я создал форму приглашения, подключенную к базе данных MS SQL, в которой хранится пароль администратора, и хотел бы попросить пользователя в целях безопасности.Кроме того, я хотел бы иметь возможность вызывать эту форму при необходимости.Я успешно реализовал это, но хотел бы добавить функцию, которая позволяет 3 попытки.Есть ли способ остановить выполнение программы и постоянно предлагать пользователю вводить текстовые поля?

output - переменная, в которой хранится результат запроса SELECT, который получает пароль.

Подтверждение - кнопка «Принять».

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

     confirmation.Click += (sender, e) => {

            //If Password is correct.
            if (textBox.Text == output)
            {
                isCorrect = true;
                Pprompt.Close();
            }
            else
            {
                isCorrect = false;
                //While the password is incorrect.
                while (isCorrect == false)
                {
                    //textBox.Text = "";
                    if (textBox.Text == output)
                    {
                        isCorrect = true;
                        Pprompt.Close();
                        break;
                    }

                    tryCount++;

                    if (tryCount == 3)
                    {
                        MessageBox.Show("Access Denied.");
                        break;
                    }
                }
            }
         }        

Я хотел бы, чтобы форма постоянно просила меня вводить данные до тех пор, пока не будет превышен предел попытки.

1 Ответ

0 голосов
/ 13 февраля 2019

Вы не можете иметь цикл внутри обработчика кликов, потому что пользовательский интерфейс зависает во время его работы, и пользователь не получает возможность делать какие-либо записи.Обработайте только одну запись и обработайте следующую, когда пользователь снова нажмет кнопку.

confirmation.Click += (sender, e) => {
    if (textBox.Text == output) // Password is correct.
    {
        isCorrect = true;
        Pprompt.Close();
    }
    else
    {
        isCorrect = false;
        textBox.Text = "";
        tryCount++;
        if (tryCount == 3)
        {
            MessageBox.Show("Access Denied.");
            Pprompt.Close();
        }
    }
}

Если вы не используете многопоточность или async / await, верно следующее:

  • Winforms основана на событии.Т.е., если не запущен ни один обработчик событий, ни один код не выполняется.
  • Если выполняется код (то есть обработчик событий), пользовательский интерфейс (UI) заморожен, и пользователь не может сделать какой-либо ввод.Он не может вводить текст или нажимать какие-либо кнопки, не может прокручивать списки и не может изменять размер или перемещать окно.
  • Во время работы обработчика событий никакой другой обработчик событий вызываться не будет.Т.е. обработчик событий никогда не будет прерван другим.Это избавляет вас от необходимости решать проблемы с многопоточностью, если вы не используете явную многопоточность.
  • Если событие должно быть запущено (например, отметка таймера) во время обработки события (например, обработчик нажатия кнопки)выполняется, выполнение обработчика события, связанного с этим новым событием, будет отложено до тех пор, пока не вернется первый обработчик события.
...