单击按钮时,WinForm验证不会验证

时间:2014-01-15 15:52:44

标签: c# winforms validation registration

我正在创建一个C#Windows注册表单,这意味着用户必须输入他的用户名,密码和其他详细信息才能注册帐户。

所以我使用“Validating”事件,每个文本框有两个“ErrorProviders”来验证文本框(一个用于错误,一个用于ok),以确保用户名长度至少为5个字符,密码至少包含1个大写字母,1个小写字母等,电子邮件格式正确...你明白了。

以下是我的用户名文本框的验证代码之一:

private void usrTxtBox_Validating(object sender, CancelEventArgs e)
{
    if (string.IsNullOrEmpty(usrTxtBox.Text))
    {
        usrOk.Clear();
        usrError.SetError(usrTxtBox, "field required!");
        count++;
    }
    else if (!Regex.IsMatch(usrTxtBox.Text, "</REGEX PATTERN/>"))
    {
        usrOk.Clear();
        usrError.SetError(usrTxtBox, "</ERROR MESSAGE/>");
        count++;
    }
    else
    {
        usrError.Clear();
        usrOk.SetError(usrTxtBox, "good to go");
        count = 0;
    }
}

每个文本框都会重复(我有用户名,密码,姓名,电子邮件和联系电话,每个都有不同的正则表达式。

大家都知道,“验证”事件只会在文本框被“聚焦”然后“失去焦点”时才会生效。因此,当我通过正确输入第一个文本框所需的值来单击“注册”时,count将等于0,因此不会出现错误。注册代码按钮点击下方:

private void rgstr_Click(object sender, EventArgs e)
{
    if (ValidateChildren())
    {
        if (count != 0)
        {
            MessageBox.Show("check again");
        }
        else if (count == 0)
        {
            MessageBox.Show("gd to go");
        }
    }
}

我尝试使用ValidateChildren强制验证,但它不起作用。这有什么解决方案吗?或者是否有另一种验证我的文本框的解决方案?

1 个答案:

答案 0 :(得分:1)

尝试此模式进行验证

private bool ValidateChildren()
 {
   bool IsValid = true;
   // Clear error provider only once.
   usrError.Clear(); 

   //use if condition for every condtion, dont use else-if
   if (string.IsNullOrEmpty(usrTxtBox.Text.Trim()))
      {
       usrError.SetError(usrTxtBox, "field required!"); 
       IsValid =false;              
      }

   if (!Regex.IsMatch(usrTxtBox.Text, "</REGEX PATTERN/>"))
      {            
       usrError.SetError(usrTxtBox, "</ERROR MESSAGE/>");
        IsValid =false; 
      }
    return IsValid ;
  }

并按下按钮点击:

   private void rgstr_Click(object sender, EventArgs e)
    {
      if (ValidateChildren())
        {
          // valid
        }
      else
       {
         //Error will shown respective control with error provider
       }
    }