Программирование

Как ограничить ввод в 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


Как реализовать ограничение ввода только целыми числами

Если вам нужен чистый целочисленный ввод, сразу можно воспользоваться готовыми контролами:

  • MaskedTextBox с маской 0000000000 (или любой нужной длины) автоматически игнорирует любые символы, которые не соответствуют маске.
  • NumericUpDown ограничивает ввод только целыми числами и предоставляет стрелки для изменения значения.

Но если хочется оставить обычный TextBox и при этом убедиться, что пользователь видит ошибку сразу, лучше обрабатывать событие KeyPress и отменять ввод недопустимых символов.


Обработка события KeyPress с использованием регулярного выражения

csharp
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

csharp
MaskedTextBox mtx = new MaskedTextBox
{
    Mask = "0000",          // Позволяет ввести до 4 цифр
    PromptChar = '_',       // Символ заполнения
    Text = "0000"           // Или пустой
};

Плюсы:

  • Удобно задавать фиксированную длину.
  • Автоматически игнорирует недопустимые символы.

Минусы:

  • Ограничено точным количеством символов.
  • Не позволяет динамически менять размер.

NumericUpDown

csharp
NumericUpDown nud = new NumericUpDown
{
    Minimum = int.MinValue,
    Maximum = int.MaxValue,
    Increment = 1,
    Value = 0
};

Плюсы:

  • Позволяет задавать диапазон значений.
  • Автоматически обновляет текст при изменении.

Минусы:

  • Содержит стрелки, иногда слишком громоздко для простого ввода.
  • Не поддерживает «пустое» значение без дополнительной логики.

Обратная связь с ErrorProvider

Если вам нужен более явный визуальный отклик, объедините KeyPress с ErrorProvider:

csharp
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:

csharp
private void TxtNumber_TextChanged(object sender, EventArgs e)
{
    ep.SetError(txtNumber, string.Empty);
}

Заключение

  • Для простого и быстрого решения: используйте KeyPress с регулярным выражением – это отбрасывает любые нечисловые символы мгновенно.
  • Если нужна строгая длина: MaskedTextBox с маской 000…0.
  • Если требуется диапазон и кнопки: NumericUpDown.
  • Для более дружелюбной обратной связи: добавьте ErrorProvider или ToolTip.

Выберите подходящий вариант в зависимости от требований к UI и пользовательского опыта.

Источники

  1. Microsoft Docs – KeyPressEventArgs.Handled
  2. Microsoft Docs – MaskedTextBox
  3. Microsoft Docs – NumericUpDown
  4. Stack Overflow – How to restrict TextBox to numeric input only
Авторы
Проверено модерацией
Модерация