2014-01-18 136 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