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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3413708/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 14:59:07  来源:igfitidea点击:

How to allow user to enter only numbers in a textbox in vb.net?

vb.net

提问by Davideg

How can I prevent the user to enter characters but only numbers and '.' in a textbox in vb.net 2005?

如何防止用户输入字符但只输入数字和“。” 在 vb.net 2005 的文本框中?

回答by Edward Leno

The following will allow you to test for specific key values (from http://www.daniweb.com/forums/thread127299.html):

以下将允许您测试特定的键值(来自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

If this isn't what you are looking for, try the isNumeric()function.

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

回答by Tom 'Blue' Piddock

Just to help, I had a snippet which I was making for a calculator which may help, it allows Delete, Backspace, Digits and the '.' char. You can also add in a call to a function to process the text box on the pressing of the Enter key.

只是为了帮助,我有一个我正在为计算器制作的片段,它可能会有所帮助,它允许删除、退格、数字和“。” 字符。您还可以添加对函数的调用,以在按下 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

This code allows entry of all numbers, the back space and delete keys as well as only allowing one '.' in the text. An idea might be to add the TAB function to allow Tab stops.

此代码允许输入所有数字、退格和删除键,并且只允许输入一个“.”。在文中。一个想法可能是添加 TAB 函数以允许 Tab 停止。

回答by Parag Sudame

Dim num1 As Integer

Try   

   num1 = Cint(TextBox1.Text)

Catch ex As Exception

   TextBox1.Clear()    
   TextBox1.Focus()

End Try

For Single Numbers you may use num1 = Csng(textbox1.text)

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

回答by BlackPearl

try this;

尝试这个;

 Dim Validinputchar = "0123456789." + vbBack

    If Not Validinputchar.Contains(e.KeyChar) Then

        e.KeyChar = Nothing

    End If

The Validinputcharvariable contains only the characters you want a user to enter in a textbox.

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

Note: the code should be placed under the textbox_keypressevent

注意:代码应该放在textbox_keypress事件下面

回答by audie

  • First, add a TextBox.
  • Second, Change the event from TextChangedto KeyPress.
  • You see it at the upper right of your field codes, then click the small arrow.
  • Populate this codes between your 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
    
  • I hope it can help you this simple codes
  • for more information http://[email protected]
  • 首先,添加一个文本框。
  • 其次,将事件从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://[email protected]

回答by Naveen

This works

这有效

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

回答by SysDragon

Try this:

尝试这个:

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

But this allow only numbers, and you may what to admit decimal digits adding this condition:

但这仅允许数字,并且您可以添加以下条件来承认十进制数字:

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

You can get the decimal separator with:

您可以使用以下方法获取小数点分隔符:

Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSepar??ator


Another simple option is to do this:

另一个简单的选择是这样做:

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

回答by Tim Ryder

I wrote a fool proof routine that eliminates the Alpha characters and allows all of the others.

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

You could technically put any character you want in the string to prevent it from being entered like punctuation marks.

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

    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

This is a nice clean simple way of preventing any character in the disallowedKeys string from being entered in any textbox or field you choose, just have the KeyDown event of the control reference this method.

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

回答by Sach

Here is the Better Answer in My Opinion:

这是我认为更好的答案:

   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

Cheers,Sach

干杯,萨赫

回答by mike

After searching through several results here on stackoverflow and elsewhere I wasn't satisfied with the solutions I found: they all had drawbacks of some sort, mostly keyboard layout issues or incorrect handling of control keys, e.g. Ctrl+C wasn't possible anymore.

在 stackoverflow 和其他地方搜索了几个结果后,我对找到的解决方案并不满意:它们都有某种缺点,主要是键盘布局问题或控制键的不正确处理,例如 Ctrl+C 不再可能。

The solutions I tried all went for the KeyDown/Up approach; I decided to try the TextChanged event and implementing the simple logic: if the current input doesn't validate, then replace it with the old value; else: update the old value.

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

Of course - as always - implementing the feature details turned out to be a bit more complex :o| ...but in the end I now have a TextBox that can be limited to integer or double values within a specified range and that has a new event, ApplyValue, that can be listened to - instead of TextChanged or Validated - which is fired depending on the chosen style, i.e. numeric values shouldn't fire events while typing, but for some text values it may be desirable.

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

'nuff said, here's the full code of the control that I'd like to share with the absolutely amazing stackoverflow community - my first contribution ;o) I hope it can be of some use to someone!

'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