1

我有两个文本框。在采取任何其他行动之前,我需要验证它们。

private ErrorProvider _errorProviderEmail = new ErrorProvider();
private ErrorProvider _errorProviderPass = new ErrorProvider();
public FormLogin()
{
  InitializeComponent();

  textBoxEmail.Validating += TextBoxEmailValidating;
  textBoxPass.Validating += TextBoxPassValidating;

  textBoxEmail.Validated += TextBoxEmailValidated;
  textBoxPass.Validated += TextBoxPassValidated;

  textBoxEmail.Text = "";
  textBoxPass.Text = "";
}

void TextBoxPassValidated(object sender, EventArgs e)
{
  _errorProviderPass.SetError(textBoxPass, "");
}

void TextBoxEmailValidated(object sender, EventArgs e)
{
  _errorProviderEmail.SetError(textBoxEmail, "");
}

void TextBoxPassValidating(object sender, System.ComponentModel.CancelEventArgs e)
{
  if (!string.IsNullOrEmpty(textBoxPass.Text)) return;
  e.Cancel = true;
  _errorProviderPass.SetError(textBoxPass,"Password is required!");
}

void TextBoxEmailValidating(object sender, System.ComponentModel.CancelEventArgs e)
{
  if (!string.IsNullOrEmpty(textBoxEmail.Text)) return;
  e.Cancel = true;
  _errorProviderEmail.SetError(textBoxEmail, "Email address is required!");
}

问题是只textBoxEmail触发了验证事件,这里可能出了什么问题,为什么验证事件textBoxPass永远不会触发?

4

2 回答 2

3

单个 TextBox 控件仅在失去焦点时进行验证。

尝试调用表单的ValidateChildren()函数来强制每个控件调用它们的验证处理程序:

private void button1_Click(object sender, EventArgs e) {
  if (this.ValidateChildren()) {
    this.Close();
  }
}

此外,您只需要一个ErrrorProvider组件。

于 2012-05-09T15:29:48.747 回答
0

Validating仅当接收焦点的控件将CausesValidation属性设置为 true时才会引发该事件。

例如,如果您在TextBox1'sValidating事件中编写了代码,然后单击 OK 按钮 ( CausesValidation = true),则会引发 Validating 事件,但如果您单击 Cancel 按钮 ( CausesValidation = false),Validating则不会引发该事件。

CodeProject上的源代码

于 2017-02-16T16:31:33.867 回答