2014-01-18 5 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, ""); 
    } 
} 

Проблема у меня есть с , появляется поставщик ошибок, но когда я нажимаю другую клавишу, значок для errorprovider исчезает, но символ не вводится, что хорошо. Как сохранить значок поставщика ошибок?

+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

Конечно ... вы должны легко использовать RegEx для проверки этих символов. –

+0

Я никогда не использовал такую ​​вещь, это мой первый год на форме окна извините – LukeBorg

Смежные вопросы