Поставщики ошибок
Я пытаюсь применить поставщиков ошибок к текстовому полю,
Пользователь не может ввести более 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, "");
}
}
У меня проблема с вводом символов, провайдер ошибок появляется, но когда я нажимаю другую клавишу, значок провайдера ошибок исчезает, но символ не вводится, что хорошо. Как сохранить значок поставщика ошибок?
2 ответа
Вы должны переписать свои условия в логической форме. Каждый случай, когда нет правильного ввода, должен иметь свое определение и иметь правильную установленную ошибку. В другом случае (ввод правильный), удалите ошибку. Упрощенно это должно выглядеть так:
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, "");
}
Таким образом, вы можете добавить больше условий легко. Если вы хотите, например, чтобы текст не содержал #
, просто добавьте следующее утверждение:
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)) : "");
}