Как ограничить ввод в TextBox только целыми числами
Используйте MaskedTextBox, NumericUpDown или обработчик KeyPress с регулярным выражением для мгновенной проверки ввода целых чисел в Windows Forms.
How can I create a Windows Forms TextBox that accepts only numeric input, giving instant feedback when someone types an invalid character? I need a TextBox that only accepts integer values. In the past, I overrode the KeyPress event and filtered out bad characters. I’d prefer a more general approach—maybe using a regular expression or taking into account other control values. Ideally, when a non‑numeric key is pressed, nothing should happen, or the user should be told right away that the character is invalid.
The simplest way is to let the control itself enforce the rule: use a MaskedTextBox or a NumericUpDown for pure integer input, or attach a KeyPress handler that checks a regular‑expression pattern and cancels the keystroke. For a plain TextBox that still needs instant feedback, combine a KeyPress event with an ErrorProvider so the user sees a message the moment an invalid character is typed.
Contents
- Как реализовать ограничение ввода только целыми числами
- Обработка события KeyPress с использованием регулярного выражения
- Использование MaskedTextBox и NumericUpDown как альтернативы
- Обратная связь с ErrorProvider
Как реализовать ограничение ввода только целыми числами
Если вам нужен чистый целочисленный ввод, сразу можно воспользоваться готовыми контролами:
- MaskedTextBox с маской
0000000000(или любой нужной длины) автоматически игнорирует любые символы, которые не соответствуют маске. - NumericUpDown ограничивает ввод только целыми числами и предоставляет стрелки для изменения значения.
Но если хочется оставить обычный TextBox и при этом убедиться, что пользователь видит ошибку сразу, лучше обрабатывать событие KeyPress и отменять ввод недопустимых символов.
Обработка события KeyPress с использованием регулярного выражения
using System.Text.RegularExpressions;
using System.Windows.Forms;
public partial class Form1 : Form
{
// Регулярное выражение для целых чисел (можно добавить знак +/‑)
private static readonly Regex _intRegex = new Regex(@"^[0-9]$");
public Form1()
{
InitializeComponent();
txtNumber.KeyPress += TxtNumber_KeyPress;
}
private void TxtNumber_KeyPress(object sender, KeyPressEventArgs e)
{
// Разрешаем клавишу Backspace (ASCII 8) и Delete (ASCII 127)
if (char.IsControl(e.KeyChar))
return;
// Если символ не соответствует регулярному выражению, отменяем ввод
if (!_intRegex.IsMatch(e.KeyChar.ToString()))
{
e.Handled = true; // Не вставляем символ
System.Media.SystemSounds.Beep.Play(); // Немного звуковой сигнализации
}
}
}
Пояснения:
| Пункт | Что делает | Где можно изменить |
|---|---|---|
char.IsControl(e.KeyChar) |
Позволяет клавиши управления (Backspace, Delete, Arrow keys). | Можно расширить, если нужны другие клавиши. |
e.Handled = true |
Отменяет вставку символа в TextBox. | Если хочется показать подсказку, добавьте ErrorProvider. |
System.Media.SystemSounds.Beep.Play() |
Быстрый аудиторный сигнал. | Можно заменить на MessageBox.Show или ErrorProvider. |
Преимущества:
- Мгновенная реакция: пользователь не видит «плохой» символ.
- Гибкость: легко добавить поддержку знака минус, запятой, десятичного разделителя и т.д.
Недостатки:
- Никакая визуальная подсказка, если пользователь просто нажимает клавишу без звука.
- Не обрабатывает вставку через правую кнопку мыши или
Ctrl+V.
Чтобы покрыть эти сценарии, можно дополнительно обработать событие TextChanged и откатить последние изменения, но обычно KeyPress покрывает большинство случаев.
Использование MaskedTextBox и NumericUpDown как альтернативы
MaskedTextBox
MaskedTextBox mtx = new MaskedTextBox
{
Mask = "0000", // Позволяет ввести до 4 цифр
PromptChar = '_', // Символ заполнения
Text = "0000" // Или пустой
};
Плюсы:
- Удобно задавать фиксированную длину.
- Автоматически игнорирует недопустимые символы.
Минусы:
- Ограничено точным количеством символов.
- Не позволяет динамически менять размер.
NumericUpDown
NumericUpDown nud = new NumericUpDown
{
Minimum = int.MinValue,
Maximum = int.MaxValue,
Increment = 1,
Value = 0
};
Плюсы:
- Позволяет задавать диапазон значений.
- Автоматически обновляет текст при изменении.
Минусы:
- Содержит стрелки, иногда слишком громоздко для простого ввода.
- Не поддерживает «пустое» значение без дополнительной логики.
Обратная связь с ErrorProvider
Если вам нужен более явный визуальный отклик, объедините KeyPress с ErrorProvider:
ErrorProvider ep = new ErrorProvider();
ep.BlinkStyle = ErrorBlinkStyle.NeverBlink;
private void TxtNumber_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsControl(e.KeyChar))
return;
if (!_intRegex.IsMatch(e.KeyChar.ToString()))
{
e.Handled = true;
ep.SetError(txtNumber, "Введите только цифры");
}
}
При каждом неверном вводе появляется всплывающая иконка с надписью. Очистить ошибку можно в событии TextChanged:
private void TxtNumber_TextChanged(object sender, EventArgs e)
{
ep.SetError(txtNumber, string.Empty);
}
Заключение
- Для простого и быстрого решения: используйте
KeyPressс регулярным выражением – это отбрасывает любые нечисловые символы мгновенно. - Если нужна строгая длина:
MaskedTextBoxс маской000…0. - Если требуется диапазон и кнопки:
NumericUpDown. - Для более дружелюбной обратной связи: добавьте
ErrorProviderилиToolTip.
Выберите подходящий вариант в зависимости от требований к UI и пользовательского опыта.