如何允许用户只在vb.net的文本框中输入数字?

时间:2010-08-05 10:12:45

标签: vb.net

如何阻止用户输入字符,但只能输入数字和'。'在vb.net 2005的文本框中?

12 个答案:

答案 0 :(得分:9)

以下内容允许您测试特定的键值(来自http://www.daniweb.com/forums/thread127299.html):

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    If (Microsoft.VisualBasic.Asc(e.KeyChar) < 48) _
              Or (Microsoft.VisualBasic.Asc(e.KeyChar) > 57) Then
            e.Handled = True
    End If
    If (Microsoft.VisualBasic.Asc(e.KeyChar) = 8) Then
            e.Handled = False
    End If
End Sub

如果这不是您要找的,请尝试isNumeric()功能。

答案 1 :(得分:5)

只是为了帮助,我有一个片段,我正在制作一个可能有用的计算器,它允许删除,退格键,数字和'。'焦炭。您还可以添加对函数的调用,以便在按下Enter键时处理文本框。

  Private Sub Box_Input_KeyDown(ByVal sender As Object, _
                                ByVal e As System.Windows.Forms.KeyEventArgs) _
                                Handles Box_Input.KeyDown



    If Char.IsDigit(Chr(e.KeyValue)) Or _
       Chr(e.KeyValue) = "¾"c Or _
       e.KeyData = Keys.Delete Or _
       e.KeyData = Keys.Back Then

        If Chr(e.KeyValue) = "¾"c Then
            If Box_Input.Text.Contains(".") Then
                e.SuppressKeyPress = True
            Else
                e.SuppressKeyPress = False
            End If
        End If
    ElseIf e.KeyData = Keys.Enter Then
         `State a call to function for when Enter is pressed`
    Else
        e.SuppressKeyPress = True
    End If

End Sub

此代码允许输入所有数字,后退空格和删除键以及仅允许一个'。'在文中。一个想法可能是添加TAB功能以允许Tab停止。

答案 2 :(得分:1)

Dim num1 As Integer

Try   

   num1 = Cint(TextBox1.Text)

Catch ex As Exception

   TextBox1.Clear()    
   TextBox1.Focus()

End Try

对于单个号码,您可以使用num1 = Csng(textbox1.text)

答案 3 :(得分:1)

试试这个;

 Dim Validinputchar = "0123456789." + vbBack

    If Not Validinputchar.Contains(e.KeyChar) Then

        e.KeyChar = Nothing

    End If

Validinputchar变量仅包含您希望用户在文本框中输入的字符。

注意:代码应放在textbox_keypress事件

答案 4 :(得分:0)

您可以使用KeyDown事件检查按下的键的值是否为数字或“。”并在输入为数字或“。”时将event属性设置为true。 (我可能错误处理属性的值,因为我不记得丢弃事件是否为真或假,并阻碍了输入文本框的键)

答案 5 :(得分:0)

查看ErrorProvider。使用它可以防止焦点离开控制,直到输入正确的值,同时允许用户按下取消或对话框关闭按钮。

答案 6 :(得分:0)

试试这个:

Sub TB_Press(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    If Not Char.IsDigit(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then
        e.Handled = True
    End If
End Sub

但是这只允许数字,你可以接受添加这个条件的十进制数字:

If e.KeyChar <> decSeparator AndAlso _
                     Not CType(sender, TextBox).Text.Contains(decSeparator) Then

您可以使用以下内容获取小数点分隔符:

Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSepar‌​ator

另一个简单的选择是:

Sub TB_Press(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    Dim text As String = Ctype(sender, TextBox).Text
    e.Handled = Double.TryParse(text, New Double)
End Sub

答案 7 :(得分:0)

我写了一个傻瓜证明程序,它消除了Alpha字符并允许所有其他字符。

你可以在技术上将任何你想要的字符放在字符串中,以防止它像标点符号一样输入。

    Private Sub checkIfNumber(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles tbReOrderAmount.KeyDown

    Dim disallowedKeys As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    If Boolean.Parse(disallowedKeys.Contains(e.KeyCode.ToString)) Then
        e.SuppressKeyPress = True
    End If
End Sub

这是一种很好的简洁方法,可以防止在您选择的任何文本框或字段中输入disallowedKeys字符串中的任何字符,只需让控件的KeyDown事件引用此方法即可。

答案 8 :(得分:0)

以下是我的意见中的更好答案:

   Private Sub txtScale_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtScale.KeyPress
          If IsNumeric(txtScale.Text + e.KeyChar) = False Then e.Handled = True
   End Sub

干杯上,Sach

答案 9 :(得分:0)

在stackoverflow和其他地方搜索了几个结果后,我对我发现的解决方案不满意:它们都有某些缺点,主要是键盘布局问题或控制键的错误处理,例如:无法再使用Ctrl + C。

我尝试过的解决方案都采用了KeyDown / Up方法;我决定尝试TextChanged事件并实现简单逻辑:如果当前输入未验证,则将其替换为旧值; else:更新旧值。

当然 - 一如既往 - 实现功能细节变得有点复杂:o | ...但最后我现在有一个TextBox,它可以限制在指定范围内的整数或双精度值,并且有一个新事件,ApplyValue,可以被监听 - 而不是TextChanged或Validated - 这是取决于在所选择的样式上,即数字值不应在键入时触发事件,但对于某些文本值,可能需要。

'nuff说,这里是控件的完整代码,我想与绝对惊人的stackoverflow社区分享 - 我的第一个贡献; o)我希望它对某人有用!

Imports System.ComponentModel

Public Class RestrictedTextbox
    Inherits Windows.Forms.TextBox

#Region "Constructor, StyleEnum, ApplyValue event"
    Public Sub New()
        MyBase.New()
    End Sub

    'use enum instead of flags because of the overhead for creating a UiTypeEditor
    Public Enum StyleEnum
        [Integer]
        IntegerZero
        [Double]
        DoubleZero
        TextOnChange
        TextOnValidate
    End Enum

    Public Event ApplyValue(sender As Object, e As System.EventArgs)
#End Region

#Region "New Properties"
    Private _style As StyleEnum = StyleEnum.TextOnValidate
    <Category("Restrictions"), _
     Description("Determines input validation, alignment and when the ApplyValue event is raised"), _
     Browsable(True), DefaultValue(StyleEnum.TextOnValidate)> _
    Public Shadows Property Style As StyleEnum
        Get
            Return _style
        End Get
        Set(value As StyleEnum)
            _style = value

            initializeText()
        End Set
    End Property

    Private _min As Integer = 0
    <Category("Restrictions"), _
     Description("Minimum value (for numeric styles)"), _
     Browsable(True), DefaultValue(0)> _
    Public Property Minimum As Integer
        Get
            Return _min
        End Get
        Set(value As Integer)
            _min = value

            initializeText()
        End Set
    End Property

    Private _max As Integer = 2147483647
    <Category("Restrictions"), _
     Description("Maximum value (for numeric styles)"), _
     Browsable(True), DefaultValue(2147483647)> _
    Public Property Maximum As Integer
        Get
            Return _max
        End Get
        Set(value As Integer)
            _max = value

            initializeText()
        End Set
    End Property
#End Region

#Region "Shadow properties"
    'hide and do not allow changing
    <Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Shadows Property TextAlign As Windows.Forms.HorizontalAlignment
        Get
            Return MyBase.TextAlign
        End Get
        Set(value As Windows.Forms.HorizontalAlignment)
            'do nothing
        End Set
    End Property

    'hide and always use false
    <Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Shadows Property Multiline As Boolean
        Get
            Return False
        End Get
        Set(value As Boolean)
            MyBase.Multiline = False
        End Set
    End Property

    'hide and always use true
    <Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Shadows Property CausesValidation As Boolean
        Get
            Return True
        End Get
        Set(value As Boolean)
            MyBase.CausesValidation = True
        End Set
    End Property

    'hide, but emulate default
    <Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Shadows Property Lines As String()
        Get
            Return MyBase.Lines
        End Get
        Set(value As String())
            MyBase.Lines = value
        End Set
    End Property
#End Region

#Region "validateText, initializeText"
    Private _oldText As String = ""
    Private nfi As System.Globalization.NumberFormatInfo = New System.Globalization.NumberFormatInfo With {.CurrencyDecimalSeparator = "."}

    Private Sub initializeText()
        Dim def As String = ""

        Select Case _style
            Case StyleEnum.TextOnChange, StyleEnum.TextOnValidate
                MyBase.TextAlign = HorizontalAlignment.Left
                def = ""

            Case StyleEnum.Double, StyleEnum.Integer
                MyBase.TextAlign = HorizontalAlignment.Right
                def = ""

            Case StyleEnum.DoubleZero, StyleEnum.IntegerZero
                MyBase.TextAlign = HorizontalAlignment.Right
                If _min < 0 And _max > 0 Then
                    def = "0"
                Else
                    def = _min.ToString
                End If

        End Select

        If Me.Text = "" Or Me.Text = "0" Or Not Me.validateText Then
            Me.Text = def
        End If
    End Sub


    Private Function validateText() As Boolean
        Dim negativeOk As Boolean = False
        Dim checkDouble As Boolean = False
        Dim checkInteger As Boolean = False
        Dim valueOk As Boolean = False

        Select Case _style
            Case StyleEnum.Double, StyleEnum.DoubleZero
                checkDouble = True

            Case StyleEnum.Integer, StyleEnum.IntegerZero
                checkInteger = True

            Case StyleEnum.TextOnChange, StyleEnum.TextOnValidate
                valueOk = True
        End Select

        If Not valueOk Then
            Dim txt As String = Me.Text
            If String.IsNullOrEmpty(txt) Then
                valueOk = True
            ElseIf _min < 0 And txt = "-" Then
                valueOk = True
            Else
                Dim tmp As Double = 0
                If checkDouble Then
                    valueOk = Double.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp)
                ElseIf checkInteger Then
                    valueOk = Integer.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp)
                End If

                If valueOk And ((tmp > _max) Or ((tmp < _min) And (tmp.ToString.Length >= _min.ToString.Length))) Then
                    'if value could be parsed, but
                    'value is too large or
                    'value is too small, even though the length is sufficient (to allow entering incomplete numbers, e.g. "2", if _min=10)
                    'NOTE: too small numbers will be caught in validation event
                    valueOk = False
                End If
            End If
        End If

        Return valueOk
    End Function
#End Region

#Region "Events"
    Private Sub WdTextbox_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged
        Dim valueOk As Boolean = Me.validateText

        If Not valueOk Then
            Dim oldPos As Integer = Me.SelectionStart
            Me.Text = _oldText
            If (oldPos > 0) Then
                Me.SelectionStart = oldPos - 1
            End If
        Else
            Me._oldText = Text

            If Me._style = StyleEnum.TextOnChange Then
                RaiseEvent ApplyValue(Me, New System.EventArgs)
            End If
        End If
    End Sub

    Private Sub WdTextbox_Validating(sender As Object, e As CancelEventArgs) Handles Me.Validating
        Dim txt As String = Me.Text
        Dim raise As Boolean
        Select Case _style
            Case StyleEnum.Double, StyleEnum.Integer
                Dim tmp As Double = 0
                If Double.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp) Then
                    If tmp < _min Then
                        tmp = _min
                    ElseIf tmp > _max Then
                        tmp = _max
                    End If

                    Me.Text = IIf(tmp <> 0, tmp.ToString, "")
                Else
                    Me.Text = ""
                End If
                raise = True

            Case StyleEnum.DoubleZero, StyleEnum.IntegerZero
                Dim tmp As Double = 0
                If Double.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp) Then
                    If tmp < _min Then
                        tmp = _min
                    ElseIf tmp > _max Then
                        tmp = _max
                    End If

                    Me.Text = tmp.ToString
                Else
                    Me.Text = "0"
                End If
                raise = True

            Case StyleEnum.TextOnChange
                raise = False

            Case StyleEnum.TextOnValidate
                raise = True
        End Select

        If raise Then
            RaiseEvent ApplyValue(Me, New System.EventArgs)
        End If
    End Sub
#End Region

End Class

答案 10 :(得分:0)

  • 首先,添加一个TextBox。
  • 其次,将事件从 TextChanged 更改为 KeyPress
  • 您会在字段代码的右上角看到它,然后点击小箭头。
  • 在TextBox1_KeyPress

    之间填充此代码
     If Char.IsDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
                   e.Handled = true
                   MsgBox("Please enter a valid number")
     End If
    
  • 我希望它可以帮助你解决这个简单的代码
  • 了解更多信息http://audzkie.barsalote@gmail.com

答案 11 :(得分:0)

这有效

Private Sub txt1_PreviewTextInput(sender As Object, e As TextCompositionEventArgs) Handles txt1.PreviewTextInput
   e.Handled = Not IsNumeric(e.Text)
End Sub