2012-05-09 60 views
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的驗證事件永遠不會觸發?

+0

您需要填寫這個問題..你介紹它存在的方式沒有任何人可以幫助你的方式源。你爲什麼要添加你的事件動態而不是靜態的? – gbianchi

+0

@gbianchi現在對你來說更清楚發生了什麼? – Constantin

+0

第二個事件在特定條件下不會觸發嗎?如果第一個驗證失敗,第二個驗證失敗?如果第一個_passes_驗證,第二個驗證? – David

回答

2

個人TextBox控件只有當他們失去了重心驗證。

嘗試調用形式的ValidateChildren()函數強制每個控件調用自己的驗證處理程序:

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

而且,你只需要一個ErrrorProvider組件。

+0

謝謝,你的解決方案工作正常: ) – Constantin

0

Validating事件引發僅當接收到焦點控件具有CausesValidation屬性設置爲true。

例如,如果你在TextBox1Validating事件編寫的代碼,並單擊OK按鈕(CausesValidation = true),那麼驗證事件引發,但如果你點擊取消按鈕(CausesValidation = false),那麼Validating事件沒有提出。

CodeProject