Принимайте цифры только для текстового поля - PullRequest
7 голосов
/ 26 января 2011

Я нашел этот код для того, чтобы заставить мое текстовое поле принимать только цифры.

Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    Dim allowedChars As String = "0123456789"
    If allowedChars.IndexOf(e.KeyChar) = -1 Then
        ' Invalid Character
        e.Handled = True
    End If
End Sub

Но ... пользователь не может удалить цифры с помощью кнопки возврата.Как мне тогда поступить?

Ответы [ 8 ]

9 голосов
/ 02 июня 2011
 Private Sub txtValue_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles                 txtValue.KeyPress
        'Dim allowedChars As String = "0123456789"
        'If allowedChars.IndexOf(e.KeyChar) = -1 Then
        '    ' Invalid Character
        '    e.Handled = True
        'End If
        'If (e.KeyChar = Microsoft.VisualBasic.Chr(8)) Then
        '    e.Handled = True
        'End If
        If Char.IsDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
            e.Handled = True
        End If
    End Sub                                
7 голосов
/ 26 января 2011

Вам также нужно обрабатывать вставленный текст (может не быть нажатия клавиши). Лучший способ сделать это с помощью MaskedTextBox .

3 голосов
/ 06 апреля 2015

Волдеморт

Я разработал ваш первый код, чтобы позволить пользователю удалить тоже.

Вот код:

Dim BACKSPACE As Boolean

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    If e.KeyCode = Keys.Back Then
        BACKSPACE = True
    Else
        BACKSPACE = False
    End If
End Sub

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    If BACKSPACE = False Then
        Dim allowedChars As String = "0123456789"
        If allowedChars.IndexOf(e.KeyChar) = -1 Then
            e.Handled = True
        End If
    End If
End Sub

Надеюсь, мой код был вам полезен:)

1 голос
/ 11 декабря 2013

Когда у меня было требование ввода, которое принимает только числа, я обычно использовал класс NumericUpDown. Он также обрабатывает ограничения и десятичные дроби.

1 голос
/ 26 января 2011

Используйте этот код, он вам поможет

Public Function OnlyDigitsOnKeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)

Try

    If System.Char.IsDigit(e.KeyChar) = False And e.KeyChar <> Microsoft.VisualBasic.Chr(8)        And e.KeyChar <> Microsoft.VisualBasic.Chr(46) Or (InStr(sender.text, ".") > 0 And  e.KeyChar = Microsoft.VisualBasic.Chr(46)) 
    Then
                e.Handled = True
    End If
        Catch ex As Exception
            Common.ErrorHandler(ex)
        End Try
End Function
0 голосов
/ 11 декабря 2013

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

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

ЭтоКод может быть помещен в событие TextChaned любого текстового поля.Обязательно измените имя с TextBox1, чтобы оно соответствовало вашему текстовому полю.

    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
    Dim selStart As Integer = TextBox1.SelectionStart
    Dim selMoveLeft As Integer = 0
    Dim newStr As String = "" 'Build a new string by copying each valid character from the existing string. The new string starts as blank and valid characters are added 1 at a time.

    For i As Integer = 0 To TextBox1.Text.Length - 1

        If "0123456789".IndexOf(TextBox1.Text(i)) <> -1 Then 'Characters that are in the allowed set will be added to the new string.
            newStr = newStr & TextBox1.Text(i)

        ElseIf i < selStart Then 'Characters that are not valid are removed - if these characters are before the cursor, we need to move the cursor left to account for their removal.
            selMoveLeft = selMoveLeft + 1

        End If
    Next

    TextBox1.Text = newStr 'Place the new text into the textbox.
    TextBox1.SelectionStart = selStart - selMoveLeft 'Move the cursor to the appropriate location.
End Sub

Примечание. Если вам нужно сделать это для нескольких текстовых полей, вы можете сделать универсальную версию этого, создав подпункт,принимает ссылку на текстовое поле в качестве параметра.Тогда вам нужно только вызвать подпрограмму из события TextChanged.

0 голосов
/ 03 ноября 2013
Private Sub TMarksTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TMarksTextBox.KeyPress
        If e.KeyChar < "0" OrElse e.KeyChar > "9" AndAlso e.KeyChar <> ControlChars.Back Then
            e.Handled = True
        End If
End Sub
0 голосов
/ 10 июня 2013
 Private Sub txtValue_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtValue.KeyPress
    Dim allowedChars As String = "."
    'If allowedChars.IndexOf(e.KeyChar) = -1 Then
    '    ' Invalid Character
    '    e.Handled = True
    'End If
    'If (e.KeyChar = Microsoft.VisualBasic.Chr(8)) Then
    '    e.Handled = True
    'End If
    If Char.IsDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False And allowedChars.IndexOf(e.KeyChar) = -1 Then
        e.Handled = True
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...