C# 错误提供者

C# 错误提供者,c#,winforms,errorprovider,C#,Winforms,Errorprovider,我正在尝试将错误提供程序应用于文本框 用户不能输入超过25个字符 文本框不能为空 private void txtNameandSurn_TextChanged(object sender, EventArgs e) { txtNameandSurn.MaxLength = 25; if (txtNameandSurn.Text == "") { txtNameandSurn.BackColor = Color.White; errorP

我正在尝试将错误提供程序应用于文本框

用户不能输入超过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, "");
    }
}
private void txtname和surn\u text已更改(对象发送方,事件参数e)
{
txtname和surn.MaxLength=25;
如果(txtname和surn.Text==“”)
{
txtname和surn.BackColor=Color.White;
errorProvider1.SetError(txtNameandSurn,“不能为空!”);
}
其他的
{
txtname和surn.BackColor=Color.Red;
errorProvider1.SetError(txtNameandSurn,“”);
}
if(txtNameandSurn.Text.Length>=txtNameandSurn.MaxLength)
{
errorProvider1.SetError(txtNameandSurn,“不能输入超过25个字符!”);
}
else if(txtNameandSurn.Text.Length

我的问题是字符输入,错误提供程序显示,但当我按下另一个键时,错误提供程序图标消失,但字符未输入,这是好的。如何保持错误提供程序图标显示?

您应该以合乎逻辑的方式重写条件。没有正确输入的每种情况都应该有它的定义并设置正确的错误。在另一种情况下(输入正确),删除错误。它应该是这样的:

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 '#'!");
}

为了增加新规则的可读性和灵活性,我更喜欢这种语法。请注意,这也有助于为特定数据类型创建可重用的规则集。 如果我理解的话,这个未经测试的代码应该可以解决您与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)) : "");
    }
类规则
{ 
公共函数测试{get;set;}
公共字符串消息{get;set;}
}
私有void txtname和surn_TextChanged(对象发送方,事件参数e)
{
var规则=新列表()
{
新规则(){Test=s=>!String.IsNullOrEmpty,Message=“String不能为空。”},
新规则(){Test=s=>(s.Length!s.Contains(“#”)Message=“String不能包含哈希字符。”}
};
var isValid=rules.All(r=>r.Test(txtname和surn.Text));
字符串[]消息;
如果(!isValid)
{
message=rules.Where(r=>r.Test(txtname和surn.Text)==false)。选择(r=>r.message);
}
errorProvider1.SetError((message.Length>0)?(string.Join(“;”,message)):“”;
}

我已编辑了您的标题。请参阅“”,其中一致意见是“不,他们不应该”。错误提供程序没有说明它不应该包含#字符,但它不应该包含所有特殊字符,例如#@!$%^&*()等等……当然……你应该可以很容易地使用正则表达式来测试这些字符。我从来没有使用过这样的东西。这是我在windows窗体上的第一年。对不起,这将对你有所帮助,卢克伯格:当你在处理正则表达式问题时,如果阿巴斯或我回答了你最初的问题,请礼貌地标记一个答案。如果没有,请告诉我们我们错过了重点,因此我们可以完善我们的答案。