разрешать только числа и точку (fullstop) в текстовом поле

#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;
}
  

}