如何停止Windows窗体程序执行,直到输入文本框?

时间:2019-02-12 21:37:58

标签: c# windows-forms-designer

我正在构建一个Windows窗体应用程序,该应用程序将员工信息记录存储在包括SSN的数据库中。在请求输入SSN的文本框旁边,我有一个复选框,单击该复选框可显示完整的SSN而不是最后四位数字。为了确保只有管理员才能访问此信息,我创建了一个连接到MS SQL DB的提示表单,该提示表单存储了管理员密码,并且出于安全目的,希望向用户询问密码。另外,我希望能够在需要时致电此表格。我成功实现了它,但想添加一个允许3次尝试的功能。有没有办法停止程序执行并不断提示用户在textBox中输入?

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 :(得分:1)

单击处理程序中不能包含循环,因为UI在运行时冻结,并且用户没有机会进行任何输入。 当用户再次单击按钮时,仅处理一个条目,然后处理下一个条目。

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)被冻结,并且用户无法进行任何输入。他无法输入文本或单击任何按钮,无法滚动列表,也无法调整窗口大小或移动窗口。
  • 事件处理程序正在运行时,将永远不会调用其他事件处理程序。也就是说,一个事件处理程序永远不会被另一个中断。除非您显式使用多线程,否则这可以避免您必须处理多线程问题。
  • 如果在事件处理程序(例如按钮单击处理程序)运行时应触发事件(例如计时器滴答声),则与该新事件相关联的事件处理程序的执行将推迟到第一个事件处理程序返回之后。