Ввод в Textbox только цифр

      В данной инструкции рассмотрим ввод только чисел от пользователя. В Microsoft Visual Studio присутствует элемент управления «MaskedTextBox», с его настраиваемой маской ввода, но будем считать, что сегодня нас интересует только «TextBox».
      Для реализации данной задачи воспользуемся событием «KeyPress», происходящее при нажатии клавиши, если элемент управления имеет фокус. Создайте проект Windows Form в Microsoft Visual Studio и добавьте на главную форму элемент управления «TextBox». Выберете данный компонент и сделайте клик правой клавишей мыши по нему, выберете из появившегося контекстного меню, пункт «Свойства». В открывшемся окне перейдите в события компонента (значок молнии в верхней части окна) и найдите событие «KeyPress», сделайте двойной клик по данному событию. После выполнения всех действий, вы перейдите в автоматически созданный метод «textBox1_KeyPress», события «KeyPress».
      С каждым событием «KeyPress» передается объект «KeyPressEventArgs». Данный объект включает свойство «KeyChar», предоставляющее символ нажатой клавиши. Например, при нажатии клавиш SHIFT + D данное свойство возвращает прописной знак D и его код 68. Так же присутствует свойство «Handled», которое используется для определения того, было ли событие обработано. Установив значение «Handled» в «true», событие ввода не будет передано операционной системе для обработки по умолчанию.
      Рассмотрим несколько примеров создания ограничения вводимых данных в текстовое поле.
Пример 1:
Добавьте приведенный ниже листинг в метод «textBox1_KeyPress».

if ((e.KeyChar <= 47 || e.KeyChar >= 58) && e.KeyChar != 8)
    e.Handled = true;          
      Данный пример включает в себя составные условия, используя логические операторы такие как &&(и), || (или), ! (not) и выполняет проверку десятичного кода введенного символа, по двум условиям:
  • «e.KeyChar != 8» – Если была нажата клавиша «Backspace», то разрешить удаление символа.
  • «(e.KeyChar <= 47 || e.KeyChar >= 58)» – Если введенный символ имеет ASCII код меньше или равен 47 и больше или равен 58, то ввод запрещен.
      Ниже представлена таблица кодов ASCII символов, в которой красным цветом выделены символы, ввод которых запрещен и зеленым цветом, ввод которых разрешен.
Пример 2:
Добавьте приведенный ниже листинг в метод «textBox1_KeyPress».
if (!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8))
{
    e.Handled = true;
}
      В данном примере так же используются логически операторы, такие как &&(и), ! (not) и выполняется проверка десятичного кода введенного символа, по двум условиям. Для проверки используется метод «Char.IsDigit», который возвращает «true», если введенный символ Юникода является десятичной цифрой и «false», если нет. Так же присутствует проверка на нажатие клавиши «Backspace».
      Подробную информацию о данном методе вы можете получить с сайта Microsoft MSDN по адресу http://msdn.microsoft.com.
Пример 3:
Добавьте приведенный ниже листинг в метод «textBox1_KeyPress».
if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == '.') && 
(((TextBox)sender).Text.IndexOf(".") == -1) && 
(((TextBox)sender).Text.Length != 0)))
{
    if (e.KeyChar != (char)Keys.Back)
    {
        e.Handled = true;
    }
}
      В данном примере так и в предыдущем реализована проверка кода вводимого символа с использованием метода «Char.IsDigit», но присутствует дополнительное условие, разрешающее ввод одного десятичного разделителя. Для этого используется метод «Text.IndexOf». Данный метод выполняет поиск знака точки, по словам используя текущий язык и региональные параметры. Поиск начинается с первой позиции знака в данном экземпляре (текущей строке) и продолжается до последней позиции знака. Если данный символ не был найден, то метод возвращает значение «-1». В случае если символ был найден то метод возвращает целое десятичное число, указывающее в какой позиции находится данный символ и запрещает обработку ввода символа.
      Десятичный разделитель — знак, используемый для разделения целой и дробной частей вещественного числа в форме десятичной дроби в системе десятичного исчисления. Для дробей в иных системах счисления может использоваться термин разделитель целой и дробной частей числа. Иногда также могут употребляться термины десятичная точка и десятичная запятая. (http://ru.wikipedia.org).
      Дополнительную информацию по методу «Text.IndexOf» вы можете получить по адресу: http://msdn.microsoft.com.
Пример 4:
Добавьте приведенный ниже листинг в метод «textBox1_KeyPress».

if (!System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), @"[0-9]").Success)
{
    e.Handled = true;
}
      Для проверки вводимых символов, в данном примере используется метод «Regex.Matches». Данный метод ищет во входящей строке все вхождения заданного регулярного выражения. Регулярное выражение представляет собой состоящий из символов шаблон, обозначающий последовательность символов произвольной длины. Вы можете указать любое регулярное выражение, например, разрешить ввод только символов «[a-zA-Z]» или разрешить ввод десятичного разделителя «,|.|[0-9]».
      Дополнительную информацию по методу «Regex.Matches» вы можете получить по адресу: http://msdn.microsoft.com.
Пример 5:
Добавьте приведенный ниже листинг в метод «textBox1_KeyPress».

if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(),@"\d+"))
    e.Handled = true;
      Данный пример так же использует заданное регулярное выражение для реализации проверки введенного символа. В регулярном выражении используется оператор «+», который означает, что требуется найти один или несколько символов одного и того же типа. Например, \d+ соответствует числам "1", "11", "1234", и т.д. Если вы не уверены, что за числом будут следовать какие-нибудь цифры? Вы можете указать, что допускается как любое число цифр, так и отсутствие цифр. Для этого служит символ «*».
Пример 6:
      Для реализации данного примера вам необходимо воспользоваться событием «KeyDown», элемента управления «textBox1». Перейдите в конструктор главной формы и выберете компонент «textBox1». Сделайте клик правой клавишей мыши по данному элементу управления, выберете из появившегося контекстного меню, пункт «Свойства». В открывшемся окне перейдите в события компонента (значок молнии в верхней части окна) и найдите событие «KeyDown», сделайте двойной клик по данному событию. После выполнения всех действий, вы перейдите в автоматически созданный метод «textBox1_KeyDown», события «KeyDown». Данное событие происходит при каждом нажатии клавиши, если элемент управления имеет фокус.

Добавьте приведенный ниже листинг в метод «textBox1_KeyDown».
e.SuppressKeyPress = true;
// Пропускаем цифровые кнопки
if ((e.KeyCode >= Keys.D0) && (e.KeyCode <= Keys.D9)) e.SuppressKeyPress = false;
// Пропускаем цифровые кнопки с NumPad'а
if ((e.KeyCode >= Keys.NumPad0) && (e.KeyCode <= Keys.NumPad9)) e.SuppressKeyPress = false;
// Пропускаем Delete, Back, Left и Right
if ((e.KeyCode == Keys.Delete) || (e.KeyCode == Keys.Back) ||
    (e.KeyCode == Keys.Left) || (e.KeyCode == Keys.Right)) e.SuppressKeyPress = false;
      Данный пример использует свойство «KeyEventArgs.SuppressKeyPress», которое получает или задает значение, указывающее, следует ли передавать события нажатия клавиши базовому элементу управления. При установке в данном свойстве значения «true», означает, что события «KeyDown» или «KeyUp» не должны обрабатываться в элементе управления «textBox1», для разрешения необходимо установить значение — «false».
      Дополнительную информацию по свойству «KeyEventArgs.SuppressKeyPress», вы можете получить по адресу http://msdn.microsoft.com.

Ссылка для скачивания примера: Яндекс.Диск


3 комментария:

  1. Не надо так же забывать, что стандартному task manager есть альтернативы. Такого рода программы порой очень полезны. Во-первых, обычно они совмещают в себе разные инструменты. Во-вторых, они предоставляют намного больше информации, чем обычный task manager Windows. И в-третьих, добавляют ряд полезной функциональности.
    Поэтому не факт, что процесс будет скрыт.

    Если вам интересно, то более подробно вы можете узнать в обзоре по адресу http://ida-freewares.ru/optimization/41-best-free-process-viewer.html.

    ОтветитьУдалить
  2. Здравствуйте Tutanhamon, данная статья относится только к стандартному диспетчеру задач Windows и на представленном скриншоте это видно.

    ОтветитьУдалить
  3. Я о другом. Речь идет о том, что после использования кода стоит проверить его и на других (это уже для тех, кто будет реализовывать в будущем). Хотя, если расчет именно на обычных пользователей и на стандартную ситуацию, то, конечно, смысла проверять нет, разве только для интереса.

    ОтветитьУдалить

Большая просьба, не писать в комментариях всякую ерунду не по теме!