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

问题描述 投票:0回答:1

我正在构建一个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;
                    }
                }
            }
         }        

我想要发生的是表单在超过尝试限制之前一直要求我输入。

c# windows-forms-designer
1个回答
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)被冻结,用户无法进行任何输入。他无法输入文字或点击任何按钮,无法滚动列表而无法调整大小或移动窗口。
  • 当事件处理程序正在运行时,将不会调用任何其他事件处理程序。即,事件处理程序永远不会被另一个事件处理程序中断。这可以防止您必须处理多线程问题,除非您明确使用多线程。
  • 如果在事件处理程序(例如按钮单击处理程序)正在运行时应该触发事件(例如计时器滴答),则将延迟与该新事件相关联的事件处理程序的执行,直到第一个事件处理程序返回之后。
© www.soinside.com 2019 - 2024. All rights reserved.