C # KeyPressEvents обработано - PullRequest
       4

C # KeyPressEvents обработано

0 голосов
/ 11 июля 2011

Я использую текстовое поле, которое я хочу разрешить только числа, и я обнаружил, что этот оператор работает.

e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);

Но почему это так! Char.IsDigit (), а не char.IsDigit ()?Почему это отрицается?Не должно ли быть так, что если я введу число, IsDigits вернет true, и это то, что я хочу?

Ответы [ 6 ]

3 голосов
/ 11 июля 2011

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

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

В качестве пояснения см. комментарии Эдвина де Коннинга, установка параметра Обращено в значение True предотвратит возникновение нажатий клавиш при их маркировке.событие как уже обработано.Вот почему операции не являются.

Оператор логически эквивалентен:

e.Handled = !(char.IsDigit(e.KeyChar) || !char.IsControl(e.KeyChar))

Так что, если символ является либо цифрой, либо управляющим символом (например, Ctrl + C), пишитене обработать событие.

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

2 голосов
/ 11 июля 2011

При перехвате нажатий клавиш установка e.Handled в true сообщает платформе, что событие уже обработано, и она не должна ничего делать от имени нажатия этой клавиши.Помечая все нежелательные нажатия клавиш как handled , вы эффективно фильтруете эти события, оставляя только те клавиши, которые хотите видеть.

2 голосов
/ 11 июля 2011

Это на самом деле! Char.IsDigit () А также ! Char.IsControl (). Таким образом, он будет игнорировать ваш ввод, если символ является цифрой А также управляющим символом. Я не уверен, что это действительно то, что вы хотите (они даже взаимоисключающие, как заявил Боб Вейл). Возможно, вам следует также изучить использование MaskedTextBox .

1 голос
/ 11 июля 2011

Давайте разберемся с этим.

Скажем, мы нажали 1 на клавиатуре, что именно происходит.

  • ! Char.IsDigit (1) == fast, так что все будетавтоматически ложно, потому что когда мы используем &&, если первая проверка ложна, тогда весь оператор становится ложным.

Теперь, если мы посмотрим на e.Handled, мы увидим, что если присвоение значения ложно, то мыпозвольте значению быть записанным в Textbox, где, если значение было true, то значение не будет принято.

1 голос
/ 11 июля 2011

Вы должны посмотреть, что делает e.Handled ... когда вы установите его в true, символ не будет введен в texbox.

0 голосов
/ 11 июля 2011

Приведенный выше метод помогает удалить входные данные, сделанные с помощью клавиш управления, таких как Shift, чтобы избежать использования прописных букв и специальных символов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...