在vb.net中的SelectAll之后没有编辑TextBox

时间:2014-07-16 07:17:06

标签: regex vb.net textbox keypress numeric

我有一个问题,问题是我必须允许用户在文本框中输入最多一个小数点的数值,

当选择所有文字并尝试通过输入任何数字键来编辑文本时,它不会让它改变。

这是带有值的文本框。 Text Box with one decimal point value

背后的代码,Keypress

Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    If Regex.IsMatch(TextBox1.Text, "\.\d") Then
        e.Handled = True
    End If
End Sub

请任何人帮助或建议更好的方式。

我添加了此代码,但我无法限制用户输入超过一个小数点值。

 If Not ((Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Or Asc(e.KeyChar) = 127) Then
        e.KeyChar = ""
        e.Handled = False
    End If

2 个答案:

答案 0 :(得分:4)

试试这个:(不是正则表达式),但对数字很有用。

它允许1 x负符号,一个fullstop(point),使用退格和任何数字..

       Private Sub priceTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles priceTextBox.KeyPress
       If IsNumeric(e.KeyChar.ToString) = False Then

            If e.KeyChar.ToString = "." And priceTextBox.Text.Contains(".") Then e.Handled = True
            If e.KeyChar.ToString = "-" And priceTextBox.Text.Contains("-") Then e.Handled = True

            If e.KeyChar.ToString <> "." Then
                If e.KeyChar <> ControlChars.Back Then
                    If e.KeyChar <> "-" Then
                        e.Handled = True
                    End If
                End If
            End If
        End If
        End Sub

修改

这允许上述数字,以及仅1个小数点。我保持简单,使用更多的代码行来显示步骤,这样你就可以看到实际发生了什么。我相信它可以改进,这是一个快速而肮脏的版本...

  • 允许小数字字符全球化
  • 还会抓住&#34;粘贴&#34;进入文本框,通常会绕过按键捕获例程

    Dim lastProperText As String = ""
    
    Private Sub priceTextBox_TextChanged(sender As Object, e As EventArgs) Handles priceTextBox.TextChanged
    
      If priceTextBox.Text = "" Then Exit Sub
      If IsNumeric(priceTextBox.Text) = False Then priceTextBox.Text = lastProperText
      If _containsDecimal(priceTextBox.Text, 2) = True Then priceTextBox.Text = lastProperText
    
    End Sub
    
    Private Sub priceTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles priceTextBox.KeyPress
        Dim decimalSeparator As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
    
        If IsNumeric(e.KeyChar.ToString) = False Then
    
            If e.KeyChar.ToString = decimalSeparator And priceTextBox.Text.Contains(decimalSeparator) Then e.Handled = True
            If e.KeyChar.ToString = "-" And priceTextBox.Text.Contains("-") Then e.Handled = True
    
            'allow backspace here
            If e.KeyChar = ControlChars.Back Then Exit Sub
    
            If e.KeyChar.ToString <> decimalSeparator Then
                If e.KeyChar <> ControlChars.Back Then
                    If e.KeyChar <> "-" Then
    
                        e.Handled = True
    
                    End If
                End If
            End If
        End If
    
        'BUG FIX
        If priceTextBox.SelectionStart > priceTextBox.Text.Length - 2 Then
          If _containsDecimal(priceTextBox.Text, 1) = True Then e.Handled = True
        End If
        '/BUG FIX
    
        'keep last good format.. we will use this in case something gets apsted in that does not meet our format...
        lastProperText = priceTextBox.Text
    
    End Sub
    
    Private Function _containsDecimal(stringtoCheck As String, decimalNumber As Integer) As Boolean
    
        Dim decimalSeparator As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
    
        'check to allow only 1 decimal point
        Dim positionOfPoint As Integer = 0
    
        'get position of decimal point (.)
        positionOfPoint = InStr(stringtoCheck, decimalSeparator)
    
        'check if there are not characters after decimal point... 
        'if nothin after decimal point, allow this keypress, 
        'if there is already something after decimal point, escape this keypress
    
        'get length of string after "."
        Dim stringTail As String = ""
    
        If Not positionOfPoint = 0 Then
            stringTail = Mid(stringtoCheck, positionOfPoint)
            If stringTail.Length > decimalNumber Then
                Return True
            End If
        End If
    
    End Function
    

答案 1 :(得分:2)

我试过这段代码:

现在工作正常.. 小数点后的一位数,您可以添加\ d \ d来在正则表达式中添加数字

 Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    If TextBox1.SelectedText.Length = TextBox1.Text.Length Then
        TextBox1.Clear()
    End If
    If Char.IsDigit(e.KeyChar) = True OrElse Char.IsControl(e.KeyChar) = True OrElse e.KeyChar = "."c Then
        If Regex.IsMatch(TextBox1.Text, "\.\d") Then
            'This makes backspace working
            If e.KeyChar = CChar(ChrW(8)) Then
            Else
                e.Handled = True
            End If
        End If
    Else
        e.Handled = True
    End If

End Sub