簡體   English   中英

如何允許用戶只在vb.net的文本框中輸入數字?

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

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

以下內容允許您測試特定的鍵值(來自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()函數。

只是為了幫助,我有一個片段,我正在制作一個可能有用的計算器,它允許刪除,退格,數字和'。' 焦炭。 您還可以添加對函數的調用,以便在按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停止。

Dim num1 As Integer

Try   

   num1 = Cint(TextBox1.Text)

Catch ex As Exception

   TextBox1.Clear()    
   TextBox1.Focus()

End Try

對於單個數字,您可以使用num1 = Csng(textbox1.text)

嘗試這個;

 Dim Validinputchar = "0123456789." + vbBack

    If Not Validinputchar.Contains(e.KeyChar) Then

        e.KeyChar = Nothing

    End If

Validinputchar變量僅包含您希望用戶在文本框中輸入的字符。

注意:代碼應放在textbox_keypress事件下

嘗試這個:

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

我寫了一個傻瓜證明程序,它消除了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事件引用此方法即可。

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

   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

歡呼聲,薩克斯

在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
  • 首先,添加一個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

您可以使用KeyDown事件來檢查按下的鍵的值是否為數字或“。” 並在輸入為數字或“。”時將event屬性設置為true。 (我可能錯誤處理屬性的值,因為我不記得丟棄事件是否為真或假,並阻礙了輸入到文本框中的鍵)

看看ErrorProvider 使用它可以防止焦點離開控制,直到輸入正確的值,同時允許用戶按取消或對話框關閉按鈕。

這有效

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM