我正在尝试将错误提供程序应用于文本框
用户输入的字符不能超过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, "");
}
}
我遇到的问题是字符输入,错误提供程序显示但是当我按下另一个键时,errorprovider的图标消失但字符未输入,这是好的。如何显示错误提供程序图标?
答案 0 :(得分: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, "");
}
这样,您可以轻松添加更多条件。例如,如果您希望tekst不包含#
,只需添加以下语句:
if(textBox1.Contains("#"))
{
errorProvider1.SetError(textBox1, "Cannot contain a '#'!");
}
答案 1 :(得分: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)) : "");
}