#vb.net #textbox #keycode
#vb.net #текстовое поле #код ключа
Вопрос:
Я знаю, что следующий код блокирует пользователь от использования пробелов в текстовом поле, однако как мне разрешить пользователю использовать только цифры и точку (чтобы я мог добавлять значения типа 1.5)
Private Sub Textbox4_keyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox4.KeyDown
If e.KeyCode = Keys.Space Then
TextBox4.Clear()
MsgBox("Invalid character. No spaces Permited...")
End If
Ответ №1:
С точки зрения удобства использования проверка правильности ввода в KeyDown
событии не очень хороша. Например, что происходит, когда пользователь хочет вставить текст в ваше текстовое поле?
Более того, пользователь все еще может вставить недопустимый ввод, используя контекстное меню текстового поля, ваш код этого не заметит.
Вы должны разрешить весь ввод, а затем проверить правильность, когда пользователь покидает текстовое поле. Для этого в VB есть дополнительное событие, которое запускается всякий раз, когда текстовое поле теряет фокус: Validating
. Используйте это событие (и только это событие) для проверки правильности ввода.
Ответ №2:
Простым подходом для этого может быть поиск «разрешенных» символов, если их нет, отобразите сообщение об ошибке.
Комментарии:
1. я просто в Google не могу найти ничего по разрешенным символам, не могли бы вы, мэйби, указать мне правильный путь?
Ответ №3:
За последние 20 лет написания кода я всегда использую следующее обоснование для символов проверки текстовых полей.
Сначала вам нужно создать отдельный класс, который вы можете назвать (для вашего удобства) Char_Validation.
Внутри этого класса вы разместите функцию, которая возвращает логическое значение следующим образом .
Public Class Char_Validation
Public Const Gr As String = "Greek"
Public Const En As String = "English"
Public Const Num As String = "Numbers"
Public Const FullGr As String = "Full Greek"
Public Const FullEn As String = "Full English"
Public Const EnN As String = "English with Numbers"
Public Const GrN As String = "Greek with Numbers"
Public Shared Function ValidateChar(ByVal AsciiChar As String, ByVal CharTable As String, ByVal sender As Object, ByVal e As System.EventArgs) As Boolean
Dim ConvChar As Integer = CUInt(Microsoft.VisualBasic.Asc(AsciiChar))
Dim ConvCharW As Integer = CUInt(Microsoft.VisualBasic.AscW(AsciiChar))
ValidateChar = False
Select Case CharTable
Case En
Select Case ConvChar
Case 65 To 126, 145 To 150, 8, 32 To 47, 58 To 64, 128, 130
ValidateChar = True
End Select
Case EnN
Select Case ConvChar
Case 48 To 57, 65 To 126, 8, 32, 45
ValidateChar = True
End Select
.
.
.
.
.
Case Num
Select Case ConvChar
Case 44 To 57, 92, 8
ValidateChar = True
End Select
End Select
End Function
End Class
В вашем классе в форме вы будете использовать TextBox_KeyPress, для которого вы будете использовать следующий код.
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
ErrorProvider1.Clear()
ErrorLabel.ForeColor = Drawing.Color.Black
Select Case Char_Validation.ValidateChar(e.KeyChar, Char_Validation.Num, sender, e)
Case True
Case False
ErrorProvider1.SetError(TextBox1, "Wrong Character Only Numbers")
Beep()
e.KeyChar = ""
End Select
End Sub
Таким образом, вы запретите пользователю размещать символы вне вашего решения.
Я надеюсь, что с этого момента вас это коснется.
Ответ №4:
Следующий код работал для меня в Firefox, IE 8, chrome, Safari и iphone.
функция dotplaced(myfield){ if(myfield.indexOf(«.»)===-1){ возвращает false; } возвращает true;
} функция numberonly(myfield, e) { var key; var keychar;
if (window.event) {
key = window.event.keyCode;
}
else if (e) {
key = e.which;
}
else {
return true;
}
keychar = String.fromCharCode(key);
// control keys
if ((key == null) || (key == 0) || (key == 8) ||
(key == 9) || (key == 13) || (key == 27)) {
return true;
}
// numbers
else if ((("0123456789").indexOf(keychar) > -1)) {
return true;
}
// decimal point jump
else if (!dotplaced(myfield.value) amp;amp; (keychar == ".")) {
//myfield.form.elements[dec].focus();
return true;
}
else {
return false;
}
}