2014-01-18 135 views
0

我嘗試錯誤商應用到一個文本框,錯誤提供商

用戶不能進入超過25個字符 文本框不能留空

private void txtNameandSurn_TextChanged(object sender, EventArgs e) 
{ 
    txtNameandSurn.MaxLength = 25; 

    if (txtNameandSurn.Text == "") 
    { 
     txtNameandSurn.BackColor = Color.White; 
     errorProvider1.SetError(txtNameandSurn, "Cannot be blank!"); 
    } 
    else 
    { 
     txtNameandSurn.BackColor = Color.Red; 
     errorProvider1.SetError(txtNameandSurn, ""); 
    } 

    if (txtNameandSurn.Text.Length >= txtNameandSurn.MaxLength) 
    { 
     errorProvider1.SetError(txtNameandSurn, "Cannot input more than 25 characters!"); 
    } 
    else if (txtNameandSurn.Text.Length < txtNameandSurn.MaxLength) 
    { 
     errorProvider1.SetError(txtNameandSurn, ""); 
    } 
} 

我的問題是與字符輸入,錯誤提供程序顯示,但是當我按另一個鍵錯誤提供程序的圖標消失,但字符不輸入這是很好的。如何保持顯示錯誤提供程序圖標?

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

你應該以合乎邏輯的方式重寫你的條件。每個沒有正確輸入的情況都應該有定義並且有正確的錯誤集。在另一種情況下(輸入正確),請刪除錯誤。簡化它應該看起來像這樣:

if (String.IsNullOrEmpty(textBox1.Text)) 
{ 
    errorProvider1.SetError(textBox1, "Cannot be blank!"); 
} 
else if(textBox1.Text.Length >= textBox1.MaxLength) 
{ 
    errorProvider1.SetError(textBox1, "Cannot input more than 25 characters!"); 
} 
else 
{ 
    errorProvider1.SetError(textBox1, ""); 
} 

這樣,您可以添加更多條件easiliy。如果你想爲例子,該tekst不包含#,只需添加以下語句:

if(textBox1.Contains("#")) 
{ 
    errorProvider1.SetError(textBox1, "Cannot contain a '#'!"); 
} 
1

對於偉大的可讀性和添加新規則的靈活性,我更喜歡這種語法。請注意,這也適用於爲特定數據類型創建可重用的規則集。 如果我瞭解它,這個未經測試的代碼應該可以解決你的errorProvider問題。

class Rule 
    { 
     public Func<string, bool> Test { get; set; } 
     public string Message { get; set; } 
    } 

    private void txtNameandSurn_TextChanged(object sender, EventArgs e) 
    { 
     var rules = new List<Rule>() 
     { 
      new Rule() { Test = s => !String.IsNullOrEmpty(s), Message="String cannot be blank." }, 
      new Rule() { Test = s => (s.Length <= txtNameandSurn.MaxLength), Message="String cannot be longer than " + txtNameandSurn.MaxLength }, 
      new Rule() { Test = s => !s.Contains("#"), Message = "String cannot contain a hash character." } 
     }; 

     var isValid = rules.All(r => r.Test(txtNameandSurn.Text)); 

     string[] message; 
     if (!isValid) 
     { 
      message = rules.Where(r => r.Test(txtNameandSurn.Text) == false).Select(r => r.Message); 
     } 

     errorProvider1.SetError((message.Length > 0) ? (string.Join(';', message)) : ""); 
    } 
+0

錯誤提供程序沒有聲明它不應該包含#字符,但它不應包含所有特殊字符,如#@!$%^&*()等。 – LukeBorg

+0

當然...您應該很容易地使用正則表達式來測試這些字符。 –

+0

我從來沒有用過這樣的東西,這是我在Windows窗體上的第一年抱歉 – LukeBorg