VB.net нужно текстовое поле, чтобы принимать только цифры - PullRequest
24 голосов
/ 02 апреля 2012

Я довольно новичок в VB.net (самоучка), и мне было просто интересно, может ли кто-нибудь помочь мне с кодом.Я не пытаюсь сделать что-то слишком сложное, просто есть TextBox, который принимает числовое значение от 1 до 10. Я не хочу, чтобы он принимал строку или любое число выше 10. Если кто-то набирает слово или символпоявится сообщение об ошибке, сообщающее ему, чтобы ввести правильный номер.Это то, что у меня есть;очевидно, это не так здорово, так как у меня проблемы.Еще раз спасибо всем, кто может помочь.

 If TxtBox.Text > 10 Then
        MessageBox.Show("Please Enter a Number from 1 to 10")
        TxtBox.Focus()
    ElseIf TxtBox.Text < 10 Then
        MessageBox.Show("Thank You, your rating was " & TxtBox.Text)
        Total = Total + 1
    ElseIf IsNumeric(TxtBox.Text) Then
        MessageBox.Show("Thank you, your rating was " & ValueTxtBox.Text)
    End If

    ValueTxtBox.Clear()
    ValueTxtBox.Focus()

Ответы [ 25 ]

30 голосов
/ 02 апреля 2012

Вы можете сделать это с использованием целых чисел Ascii.Поместите этот код в событие нажатия клавиши Textbox.e.KeyChar обозначает нажатую клавишу.А встроенная функция Asc() преобразует ее в целое число Ascii.

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

    '97 - 122 = Ascii codes for simple letters
    '65 - 90  = Ascii codes for capital letters
    '48 - 57  = Ascii codes for numbers

    If Asc(e.KeyChar) <> 8 Then
        If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
            e.Handled = True
        End If
    End If

End Sub
11 голосов
/ 16 апреля 2015

Это то, что я сделал для обработки ввода ключа и копирования / вставки.

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox.KeyPress
    If Not Char.IsNumber(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then
        e.Handled = True
    End If
End Sub

Private Sub TextBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox.TextChanged
    Dim digitsOnly As Regex = New Regex("[^\d]")
    TextBox.Text = digitsOnly.Replace(TextBox.Text, "")
End Sub

Если вы хотите разрешить десятичные дроби, добавьте

AndAlso Not e.KeyChar = "."

к оператору if в разделе KeyPress.

6 голосов
/ 13 ноября 2014

Попробуйте это:

Private Sub txtCaseID_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCaseID.KeyPress
    If Not Char.IsNumber(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then e.KeyChar = ""
End Sub
4 голосов
/ 02 апреля 2012

Сначала вы должны проверить, является ли ввод целым числом. Вы можете сделать это с Integer.TryParse:

Dim intValue As Integer
If Integer.TryParse(TxtBox.Text, intValue) AndAlso intValue > 0 AndAlso intValue < 11 Then
    MessageBox.Show("Thank You, your rating was " & TxtBox.Text)
Else
    MessageBox.Show("Please Enter a Number from 1 to 10")
End If
3 голосов
/ 13 июня 2014
Private Sub MyTextBox_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles MyTextBox.KeyPress
    If Not IsNumeric(e.KeyChar) And Not e.KeyChar = ChrW(Keys.Back) Then
        e.Handled = True
    End If
End Sub
3 голосов
/ 02 апреля 2012

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

2 голосов
/ 09 августа 2017
Private Sub textBox5_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles textBox5.KeyPress
        If Asc(e.KeyChar) <> 8 Then
            If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
                e.Handled = True
            End If
        End If
    End Sub
2 голосов
/ 23 июля 2014
Private Sub Data_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Data.KeyPress
    If (Not e.KeyChar = ChrW(Keys.Back) And ("0123456789.").IndexOf(e.KeyChar) = -1) Or (e.KeyChar = "." And Data.Text.ToCharArray().Count(Function(c) c = ".") > 0) Then
        e.Handled = True
    End If
End Sub
1 голос
/ 13 августа 2016

Это может быть слишком поздно, но для другой новой крови на VB есть кое-что простое.

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

Вот простой пример: пользователь может свободно ввести свою запись, а затем перехватить сообщение об ошибке:

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim theNumber As Integer
        Dim theEntry As String = Trim(TextBox1.Text)

        'This check if entry can be converted to
        'numeric value from 0-10, if cannot return a negative value.
        Try
            theNumber = Convert.ToInt32(theEntry)
            If theNumber < 0 Or theNumber > 10 Then theNumber = -1
        Catch ex As Exception
            theNumber = -1
        End Try

        'Trap for the valid and invalid numeric number
        If theNumber < 0 Or theNumber > 10 Then
            MsgBox("Invalid Entry, allows (0-10) only.")
            'entry was invalid return cursor to entry box.
            TextBox1.Focus()
        Else
            'Entry accepted:
            ' Continue process your thing here...

        End If
    End Sub
1 голос
/ 30 декабря 2015

Я знаю, что этот пост старый, но я хотел поделиться чем-то, что я реализовал, чтобы превратить TextBox в то, что я называю IntBox.

Сначала вам нужно сделать расширение с помощью:

<Runtime.CompilerServices.Extension()> _
Public Function HandledStringtoInteger(s As String) As Integer
    Try
        If s = String.Empty Then
            Return 0
        Else
            Return Integer.Parse(s)
        End If
    Catch
        Dim result As String = String.Empty
        Dim ReturnInt As Integer
        Dim Parsed As Integer
        For Each Character In s.ToCharArray
            If Character = "-" Then
                If s.Substring(0, 1).ToString <> "-" Then
                    result = Character + result
                End If
            End If
            If Character = "." Then
                Exit For
            End If
            If Integer.TryParse(Character, Parsed) Then
                result = result + Parsed.ToString
            End If
        Next
        If result <> String.Empty Then
            If Integer.TryParse(result, ReturnInt) Then
                Return Integer.Parse(ReturnInt)
            Else
                If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then
                    Return Integer.MaxValue
                ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then
                    Return Integer.MinValue
                Else
                    Return Integer.Parse(ReturnInt)
                End If
            End If
        Else
            Return 0
        End If
    End Try
End Function

Затем создайте событие TextChanged в виде:

Private Sub TextBox_to_IntBox(sender As Object, e As TextChangedEventArgs) Handles YourTextBox.TextChanged
    If DirectCast(sender, TextBox).IsKeyboardFocused Then
        DirectCast(sender, TextBox).Text = DirectCast(sender, TextBox).Text.HandledStringtoInteger
        DirectCast(sender, TextBox).CaretIndex = DirectCast(sender, TextBox).Text.Length
    End If
End Sub

Затем, когда пользователь вводит текст, он оценивает строку и возвращает только числовые значения, которые находятся в пределах стандартного целого числа.С помощью символа «-» вы можете изменить целое число с положительного на отрицательное и обратно.

Если кто-нибудь увидит что-нибудь, что может улучшить этот код, дайте мне знать, но мои тесты показывают, что это прекрасно работает для создания IntBox.

РЕДАКТИРОВАТЬ: Я нашел другой метод, который может работать, если вы используете свойства в своем коде.(Обратите внимание, что для TextBox для этого потребуется отдельное свойство)

Сначала создайте свойство:

Public Class Properties
    Implement INotifyPropertyChanged

    Private _Variable as Integer
    Public Property YourProperty as Object
    get
      Return _Variable
    end get
    set(value as Object)
      _Variable = value.ToString.ToInteger 'I will give the ToInteger extension code later
    end set
    end property
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Public Sub OnPropertyChange(ByVal e As PropertyChangedEventArgs)
    If Not PropertyChangedEvent Is Nothing Then
        RaiseEvent PropertyChanged(Me, e)
    End If
End Sub
End Class

Затем сделайте привязку в главном классе вашего окна:

Public WithEvents _YourVariable as New Properties

Public Sub New()
    InitializeComponent()
With YourTextBox
  .SetBinding(Textbox.TextProperty, New Binding("YourProperty"))
  .DataContext = _YourVariable
End With
End Sub

И, наконец, вот код расширения ToInteger, который я настроил:

''' <summary>
''' Handles conversion of variable to Integer.
''' </summary>
''' <param name="X"></param>
''' <param name="I">Returned if conversion fails.</param>
''' <returns>Signed 32bit Integer</returns>
''' <remarks></remarks>
<Runtime.CompilerServices.Extension()> _
Public Function toInteger(Of T)(ByRef X As T, Optional I As Integer = 0) As Integer
    Dim S As String = X.ToString
    Try
        If S = String.Empty Then
            Return I
        Else
            Return Integer.Parse(S)
        End If
    Catch
        Dim result As String = String.Empty
        Dim ReturnInt As Integer
        Dim Parsed As Byte
        For Each Character In S.ToCharArray
            If Character = "-" Then
                If S.Substring(0, 1).ToString <> "-" Then
                    result = Character + result
                End If
            End If
            If Character = "." Then
                Exit For
            End If
            If Byte.TryParse(Character, Parsed) Then
                result = result + Parsed.ToString
            End If
        Next
        If result <> String.Empty Then
            If Integer.TryParse(result, ReturnInt) Then
                Return Integer.Parse(ReturnInt)
            Else
                If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then
                    Return Integer.MaxValue
                ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then
                    Return Integer.MinValue
                Else
                    Return Integer.Parse(ReturnInt)
                End If
            End If
        Else
            Return I
        End If
    End Try
End Function

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

Это означает, что если оператор введет «-1w3» после изменения фокуса, он автоматически вернется как «-13».

...