2012-06-28 2 views
2

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

Private Sub TxtPStof_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtPStof.KeyPress 
    e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = ".") 

End Sub 

, которая позволяет только цифры и. в моем текстовом поле, однако я также должен иметь возможность удалять значения с помощью кнопки backspace или delete.

Возможно ли это?

Спасибо! :)

ответ

6

Хотя я полностью согласен с ответом от Konrad Rudolph
(Это действительно грязное дело, чтобы обрабатывать пользовательский ввод в случае KeyPress)
Я хотел бы дать ответ на ваш вопрос.

В MSDN в документе KeyPress указано, что The KeyPress event is not raised by noncharacter keys. Это означает, что вы не получаете клавишу Delete, а только клавишу BackSpace. Вы могли бы справиться с этой ситуацией с этим небольшим изменением в обработчик события

Private Sub TxtPStof_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtPStof.KeyPress 

    if e.KeyChar <> ControlChars.Back then 
     e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = ".") 
    end if 

End Sub 
+0

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

8

Это неправильный подход.

Это общепринятое, что ограничение входа пользователя вредно для пользовательского опыта, и вы будете всегда не обрабатывать специальные случаи (как насчет Ctrl + V, например? Ах, вы забыли об этом. Everybody делает).

Вместо этого .NET предлагает Validating event для проверки ввода пользователя. Вы должны перехватить , что событие, не нажатие клавиши. Do позволяют пользователям вводить текст, однако они хотят; в частности, позволяют им совершать ошибки (например, туман) без перерывов - это было бы чрезвычайно разрушительно и не полезно.

Затем, как только они закончатся (поскольку входной фокус покидает элемент управления), выполните проверку ввода за один раз.

0
If Char.IsLetterOrDigit(e.KeyChar) Or e.KeyChar = ControlChars.Back Or e.KeyChar = "." Then 

     e.Handled = False 

Else 

     e.Handled = True 

End If 
+0

Это запах кода: 'If x Then variable = False Else variable = True' следует переписать как' variable = Not x'. –

0

этот код отлично работает для меня.

If Not ((Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Or Asc(e.KeyChar) = 127) Then 
     e.KeyChar = "" 
     e.Handled = False 
    End If 
0

попробовать это одно:

If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then 
     If Not (Asc(e.KeyChar) = 8 Or Asc(e.KeyChar) = 46) Then e.Handled = True 
    End If 
0
Private Sub textbox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles textbox.KeyPress 
    If (e.KeyChar < "0" OrElse e.KeyChar > "9") AndAlso e.KeyChar <> ControlChars.Back Then 
     e.Handled = True 

    End If 
End Sub 

Это должно делать то, что вы хотите, чтобы это сделать.

+0

Не могли бы вы добавить какое-то объяснение, зачем использовать этот код? –

-1

Положите это на событие нажатия клавиши. Это позволяет точки и цифры

If Asc(e.KeyChar) <> 8 Then 
      If Asc(e.KeyChar) < 46 Or Asc(e.KeyChar) > 57 Or (Asc(e.KeyChar) < 48 And Asc(e.KeyChar) > 46) Then 
       e.Handled = True 
     End If 
End If 
Смежные вопросы