Вопрос

Кто-нибудь знает, почему Microsoft не поставляет числовое текстовое поле со своей .NET Framework, напримертекстовое поле, которое гарантировало бы, что введенные символы всегда являются допустимым числом?Это то, что обычно используется в приложениях с разными вкусами и действительно то, что большинство библиотек GUI (ну, тех, которые я знаю) каким-то образом предоставляют.Пока это не так это трудно написать свой собственный, но и это не тривиально.

Итак, мне интересно выяснить, может ли кто-нибудь объяснить это упущение.

Редактировать:Спасибо за предложения.В то время как замаскированные текстовые поля и числовые переходы вверх-вниз имеют свое место;Меня интересует элемент управления, который выглядит как текстовое поле, но автоматически выполняет проверку при нажатии клавиши, что ввод соответствует действительному числу.По моему (по общему признанию, ограниченному) опыту, это то, что используется довольно часто (нам не всегда нужны статические ограничения, налагаемые замаскированными текстовыми полями, точно так же, как нам не всегда нужны элементы управления вверх-вниз сбоку).

В сети существует множество реализаций этого с разной степенью качества, и действительно, есть даже пример этого на MSDN.

редактировать 2:Спасибо, ребята, похоже, что числовое управление up-down - это .СЕТЕВОЙ элемент управления, используемый только для числового ввода (и причина, по которой у нас на самом деле нет явного элемента управления числовым текстовым полем).Было бы здорово, если бы он автоматически запрещал ввод нечисловых символов (при нажатии клавиши, при вставке и т.д.), Но я думаю, этого достаточно, что он выполняет проверку, когда элемент управления теряет фокус.И можно было бы выполнить нажатие клавиши on, проверку вставки on, если бы кто-то действительно захотел...

Это было полезно?

Решение

Я поддерживаю рекомендацию Гарри Шатлера использовать NumericUpDown.Возможно, вам не нравятся элементы управления "вверх-вниз", но это является стандартный внешний вид элемента управления цифровым вводом в Windows, и вам следует дважды подумать, прежде чем использовать другой внешний вид.

Если вы в конечном итоге создадите свою собственную реализацию (или найдете ее в Интернете), вам следует обратить внимание на некоторые подводные камни.Помните, что существует множество способов передачи значения в элемент управления, помимо нажатий клавиш.Тот, что указан в вашей ссылке на MSDN, даже не переопределяет вставку, поэтому вы можете легко вставить нечисловую строку с помощью ctrl-V в элемент управления.

Другие советы

Вы могли бы использовать Маскированный текстовый блок

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

Начиная с WinForms 2.0, у вас есть MaskedTextBox.Вы можете установить маску на все, что захотите, т.е.для чисел используйте маску всех нулей.

Некоторые элементы управления .NET Framework, как ни странно, не предоставляют всех функций базового элемента управления Windows, которые они содержат.В этом случае по какой-то причине ES_NUMBER стиль не был реализован.

Возможно, вы могли бы обработать событие HandleCreated (или переопределить OnHandleCreated, поскольку текстовое поле не закрыто) и вызвать SetWindowLong Установить оконную длину чтобы установить ES_NUMBER стиль базового элемента управления редактированием. ES_NUMBER определяется как 0x2000 в WinUser.h.

Вы также можете вывести класс TextBox и захватить событие keypad и убедиться, что ничего, кроме цифр, не записано.

Если бы это была веб-страница, то то же самое было бы сделано с текстовым полем html с помощью Javascript.

Корпорация Майкрософт предоставляет третьим лицам возможность заполнить пробелы, касающиеся отсутствующих элементов управления в панели инструментов.Я полагаю, что время и затраты будут учитываться в их обосновании.

В данном случае, однако, я думаю, что Фильтрованный текстовый блок предоставляет описанную вами функциональность.

Основано на второй правке:

Тот Самый Часто задаваемые вопросы по Windows Forms рассказывает вам, как ограничить количество символов в рассматриваемом текстовом поле 26.12:

26.12 Как я могу ограничить количество символов, которые может принимать мое текстовое поле?

Вы можете обработать событие нажатия клавиши текстового поля, и если переданный символ недопустим, пометьте аргумент events как показывающий, что символ был обработан.Ниже приведено производное текстовое поле, которое принимает только цифры (и управляющие символы, такие как пробел, ...).Несмотря на то, что фрагмент использует производное текстовое поле, в этом нет необходимости, поскольку вы можете просто добавить обработчик в его родительскую форму.

Смотрите часто задаваемые вопросы для примера кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top