У меня есть приложение Windows Forms с элементом управления textbox, которое я хочу принимать только целочисленные значения. В прошлом я делал такую проверку, перегружая событие KeyPress и просто удаляя символы, которые не соответствовали спецификации. Я посмотрел на элемент управления MaskedTextBox, но мне хотелось бы более общего решения, которое могло бы работать с, возможно, регулярным выражением или зависеть от значений других элементов управления.
В идеале это должно вести себя так, что нажатие нецифрового символа либо не даст результата, либо сразу предоставит пользователю отзыв о недопустимом символе.
Ответы:
Два варианта:
Используйте
NumericUpDown
вместо этого. NumericUpDown делает фильтрацию за вас, что приятно. Конечно, это также дает вашим пользователям возможность нажимать стрелки вверх и вниз на клавиатуре, чтобы увеличивать и уменьшать текущее значение.Обработайте соответствующие события клавиатуры, чтобы запретить что-либо, кроме числового ввода. Я имел успех с этими двумя обработчиками событий в стандартном TextBox:
Вы можете удалить проверку
'.'
(и последующую проверку для более чем одного'.'
), если ваш TextBox не должен разрешать десятичные разряды. Вы также можете добавить проверку,'-'
если ваш TextBox должен разрешать отрицательные значения.Если вы хотите ограничить пользователя количеством цифр, используйте:
textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
источник
И только потому, что всегда веселее делать вещи в одну строку ...
ПРИМЕЧАНИЕ. Это НЕ мешает пользователю копировать / вставлять в это текстовое поле. Это не безопасный способ очистки ваших данных.
источник
KeyPress
события из одного и того же текстового поля. Для одного события может быть установленоe.Handled
значение true, а затем для другого может быть установлено значение false. В общем, лучше использоватьif (...) e.Handled = true;
TextChanged
Событие , которое проходит через это с регулярным выражением может исправить копипаст;)Я предполагаю, что из контекста и используемых вами тегов вы пишете приложение .NET C #. В этом случае вы можете подписаться на событие изменения текста и проверить каждое нажатие клавиши.
источник
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Вот простой автономный пользовательский элемент управления Winforms, полученный из стандартного TextBox, который допускает только ввод System.Int32 (его можно легко адаптировать для других типов, таких как System.Int64 и т. Д.). Он поддерживает операции копирования / вставки и отрицательные числа:
Обновление 2017 : мой первый ответ имеет некоторые проблемы:
Поэтому я предложил другую, более общую версию, которая по-прежнему поддерживает копирование / вставку, + и - знак и т. Д.
Для Int32 вы можете либо получить его, например:
или без деривации используйте новое событие TextValidating, например:
но хорошо то, что он работает с любой строкой и любой процедурой проверки.
источник
Именно для этого были разработаны события Validated / Validating.
Вот статья MSDN по этой теме: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
Версия TL; DR: проверьте свойство .Text в событии Validating и установите,
e.Cancel=True
когда данные недействительны.Когда вы устанавливаете e.Cancel = True, пользователь не может покинуть поле, но вам нужно будет дать ему некоторую обратную связь, что что-то не так. Я изменил цвет фона окна на светло-красный, чтобы указать на проблему. Обязательно установите его обратно,
SystemColors.Window
когда Validating вызывается с хорошим значением.источник
Validating
.<nitpick>
ОП упоминает, что немедленное запрещение / указание недействительного символа является идеальным, но,Validating
похоже, требует, чтобы фокус был перемещен в другую форму / элемент управления, прежде чем он вступит в силу.</nitpick>
Тем не менее, это отличный подход, который всегда стоит рассмотреть в более общем случае.Попробуйте MaskedTextBox . Требуется простой формат маски, чтобы вы могли ограничить ввод цифрами, датами или чем-то еще.
источник
Вы можете использовать
TextChanged
событиеисточник
Undo()
, но это приводит кStackOverflowException
.public int txtBoxValue
, и если tryParse не работает, я возвращаю текст в txtBox путемtxtBox.Text = txtBoxValue.ToString();
Это может быть полезно. Он допускает «реальные» числовые значения, включая правильные десятичные точки и предшествующие знаки плюс или минус. Вызовите его из соответствующего события KeyPress.
источник
Я работал над набором компонентов, чтобы завершить недостающий материал в WinForms, вот он: Advanced Forms
В частности, это класс для Regex TextBox
Простого добавления чего-то вроде
myNumbericTextBox.RegexString = "^(\\d+|)$";
должно быть достаточно.источник
Просто используйте элемент
NumericUpDown
управления и установите видимость этих уродливых кнопок вверх-внизfalse
.NumericUpDown
на самом деле это набор элементов управления, содержащий «спин-бокс» (кнопки «вверх-вниз»), текстовое поле и некоторый код, чтобы проверить и объединить все вместе.Маркировка:
будет скрывать кнопки, оставляя основной код активным.
Хотя это и не очевидное решение, оно простое и эффективное.
.Controls[1]
будет скрывать часть текстового поля, если вы хотите сделать это вместо этого.источник
Я сделал что-то для этого на CodePlex .
Он работает, перехватывая событие TextChanged. Если результат будет хорошим числом, он будет сохранен. Если что-то не так, последнее хорошее значение будет восстановлено. Источник слишком велик для публикации, но здесь есть ссылка на класс, который обрабатывает ядро этой логики.
источник
просто используйте этот код в текстовом поле:
источник
На нашей веб-странице с определением текстового поля мы можем добавить
onkeypress
событие для приема только номеров. Оно не будет отображать никаких сообщений, но предотвратит неправильный ввод. У меня это сработало, пользователь не мог ничего ввести, кроме номера.источник
Вы можете использовать событие TextChanged / Keypress, использовать регулярное выражение для фильтрации чисел и предпринять некоторые действия.
источник
Я бы обработал это в событии KeyDown.
источник
попробуй это очень просто
источник
Посмотрите на обработку ввода в WinForm
Я разместил свое решение, которое использует события ProcessCmdKey и OnKeyPress в текстовом поле. В комментариях показано, как использовать регулярные выражения для проверки нажатия клавиш и соответствующего блокирования / разрешения.
источник
Привет, вы можете сделать что-то вроде этого в текстовом поле события.
вот демо
источник
Кажется, что многие из текущих ответов на этот вопрос вручную анализируют входной текст. Если вы ищете определенный встроенный числовой тип (например,
int
илиdouble
), почему бы просто не делегировать работуTryParse
методу этого типа ? Например:Если вы хотите что-то более общее, но все же совместимое с Visual Studio Designer:
И, наконец, если вы хотите что-то полностью общее и не заботитесь о поддержке Designer:
источник
Должны быть приняты как целые числа, так и числа с плавающей запятой, включая отрицательные числа.
источник
Это мой подход:
и номера любого размера
источник
Используя подход, описанный в ответе Фабио Иотти, я создал более общее решение:
«ValidatedTextBox», который содержит все нетривиальные действия проверки. Все, что осталось сделать, это наследовать от этого класса и переопределить метод "IsValid" любой необходимой логикой проверки. Например, используя этот класс, можно создать «RegexedTextBox», который будет принимать только строки, которые соответствуют определенному регулярному выражению:
После этого, наследуя от класса «RegexedTextBox», мы можем легко создать элементы управления «PositiveNumberTextBox» и «PositiveFloatingPointNumberTextBox»:
источник
Извините, что разбудил мертвых, но я подумал, что кто-то может найти это полезным для дальнейшего использования.
Вот как я справляюсь. Он обрабатывает числа с плавающей запятой, но может быть легко модифицирован для целых чисел.
В основном вы можете нажать только 0 - 9 и .
Вы можете иметь только один 0 до .
Все остальные символы игнорируются и позиция курсора сохраняется.
Вот быстро модифицированная версия int:
источник
Этот работает с копированием и вставкой, перетаскиванием, клавишей вниз, предотвращает переполнение и довольно прост
источник
Не забывайте, что пользователь может вставить неверный текст в
TextBox
.Если вы хотите ограничить это, следуйте приведенному ниже коду:
источник
Я также искал лучший способ проверки только чисел в текстовом поле, и проблема с нажатием клавиш заключалась в том, что он не поддерживает копирование вставки с помощью щелчка правой кнопкой мыши или буфера обмена, поэтому придумал этот код, который проверяет, когда курсор покидает текстовое поле, а также проверяет наличие пустое поле (адаптированная версия newguy)
источник
источник
3 решение
1)
2) другое решение от msdn
}
источник http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) с помощью MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
источник
При нажатии кнопки вы можете проверить текстовое поле для цикла:
источник
Более простой ответ:
источник