vb.net中的SelectAll之后无法编辑文本框 [英] TextBox not editing after SelectAll in vb.net

查看:111
本文介绍了vb.net中的SelectAll之后无法编辑文本框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have an issue, The thing is I have to allow user to enter numeric value in text box up to one decimal point,

选择所有文本后,我尝试通过输入数字键来编辑文本,但不会对其进行更改.

When all text selected and I try try to edit text by entering any numeric key, It wont let it change.

这是带有值的文本框.

Here is the text box with value.

按键背后的代码

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

任何人都可以提供帮助或提出更好的方法.

Kindly anybody help or suggest better way.

我已经添加了此代码,但无法限制用户输入的位数不能超过一个小数点.

I have added this code but I am unable to restrict user not to enter more then one decimal point value.

 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

推荐答案

尝试以下操作:(不是regex tho),但对数字效果很好.

Try this: (not regex tho), but works great for numerics.

它允许使用1个负号,一个句点(点),使用退格键和任何数字.

It allows for 1 x negative symbol, one fullstop (point), using backspace, and any numerics..

       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个小数点.为了简化起见,我使用了更多的代码行来显示步骤,因此您可以看到实际发生的情况.我敢肯定它可以改进,这是一个快速而肮脏的版本...

This allows for the above numerics, as well as only 1 decimal point. I kept it simple with more code lines to show steps, so you can see what actually happens. I am sure it can be improved, this is a quick and dirty version...

  • 允许全球化十进制字符
  • 也将粘贴"捕获到文本框中,该文本通常会绕过按键捕获例程

  • Allows for Globalization of the decimal character
  • Also catches a "paste" into the textbox, that normally circumvents the keypress catch routines

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

这篇关于vb.net中的SelectAll之后无法编辑文本框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆