在Validating事件中使用e.Cancel = true的其他方法还有哪些?

时间:2019-04-11 07:26:55

标签: c# winforms validation user-interface

我有一些登录类型的表单,其中我对许多文本框进行了验证。

这是Textbox的验证码:

private void Required_Validated(object sender, EventArgs e)
{
    // clear errors set by provider
    this.errorProvider1.SetError((Control)sender, null);
}

private void Required_Validating(object sender, CancelEventArgs e)
{
    var control = (Control)sender;
    if (!string.IsNullOrEmpty(control.Text))
    {
        // required field is filled up
        return;
    }

    e.Cancel = true;
    // show to user an error message
    this.errorProvider1.SetError(control, Resources.RequiredFieldPopup);
}

根据最终用户的要求,他们不喜欢e.Cancel = trueTextBox.Validating事件中产生的行为-将其设置为true会强制用户输入有效输入,并且在您固定输入内容之前,您将无法使用其他任何控件

对于将ValidatedValidating事件都用作其预期设计的通用验证设计,什么是理想的替代/设计修订?

2 个答案:

答案 0 :(得分:0)

在通过单击按钮将表单字段提交到数据库或Active Directory进行身份验证之前,为什么不验证那里的字段,例如:

private void button1_Click(object sender, EventArgs e) { 
  bool isValid = true;
  foreach( var control in this.Controls)
   {
      if (string.IsNullOrEmpty(control.Text)) 
      { 
          isValid = false;
          this.errorProvider1.SetError(control, Resources.RequiredFieldPopup);
      }
   }
   if (!isValid) return;
  }

另一种方法是使用LostFocus TextBox事件。

PS:在我的手机上输入

答案 1 :(得分:0)

我意外地找到了一种对于最终用户来说是理想方案的解决方案。它是Form.AutoValidate属性,设置为 EnableAllowFocusChange 。我还认为 this 应该是此属性的默认值。我从事使用WinForms的开发已经很多年了,现在我才发现这一点(猜想我还不够用Google搜索)。

有关行为差异的更直观的解释,请参阅this