Этот вопрос, вероятно, задавался и отвечался миллион раз на всех мыслимых форумах по программированию. Каждый предоставленный ответ отличается от заявленных требований.
Поскольку вы используете MaskedTextBox
, вам доступны дополнительные функции проверки, и вам не нужно обрабатывать нажатия клавиш. Вы можете просто установить для свойства Mask что-то вроде «L» (требуется символ) или «?» (необязательные символы). Чтобы показать пользователю обратную связь о том, что ввод недопустим, вы можете использовать свойство BeepOnError
или добавить всплывающую подсказку, чтобы отобразить сообщение об ошибке. Этот механизм обратной связи должен быть реализован в обработчике событий MaskedInputRejected
.
Элемент управления MaskedTextBox
предлагает свойство ValidatingType
для проверки входных данных, которые соответствуют требованиям маски, но могут иметь неправильный тип данных. Событие TypeValidationCompleted
возникает после проверки типа, и вы можете обработать его, чтобы определить результаты.
Если вам все еще нужно обрабатывать события нажатия клавиш, тогда читайте дальше ...!
Метод, который я бы порекомендовал в вашем случае, состоит в том, что вместо обработки события KeyDown
(якобы вам не нужна расширенная обработка ключей) или использования регулярных выражений для сопоставления ввода (откровенно говоря, излишнее), я бы просто использовал встроенные свойства структуры Char.
private void maskedTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
Char pressedKey = e.KeyChar;
if (Char.IsLetter(pressedKey) || Char.IsSeparator(pressedKey) || Char.IsPunctuation(pressedKey))
{
// Allow input.
e.Handled = false
}
else
// Stop the character from being entered into the control since not a letter, nor punctuation, nor a space.
e.Handled = true;
}
}
Обратите внимание, что этот фрагмент также позволяет обрабатывать знаки пунктуации и разделителя.