如何在给出文本框输入之前停止执行Windows窗体程序



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

输出是一个变量,用于存储获取密码的"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;
}
}
}
}        

我希望表单一直要求我输入,直到超过尝试限制。

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

最新更新