【问题标题】:VB.NET: Manipulating TextBox Input: Dash every 5 characters and removing special charactersVB.NET:操作文本框输入:每 5 个字符破折号并删除特殊字符
【发布时间】:2012-01-07 02:28:38
【问题描述】:

基本上我正在尝试复制 Windows 7 (In-Windows) 激活密钥 TextBox 表单。将自动大写字母、删除或拒绝所有非字母数字字符的表单,除了每 5 个将自动输入的字符的破折号。

我认为这可以通过一个相当复杂的替换正则表达式来完成,但我似乎无法创建一个来满足需要。

这是我现在拥有的一个示例,但它创建了一个无限循环,因为它删除了包括破折号在内的所有字符,而不是添加破折号,这会更改文本并再次删除破折号。

任何建议、解决方案或想法都将不胜感激!

代码从原始问题修改为我正在使用的解决方案:

      Private Sub aKeyTextField_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles aKeyTextField.KeyPress
    'Test only
    If Char.IsLetterOrDigit(e.KeyChar) Then
        Dim test As String = ""
        Select Case e.KeyChar
            Case "0" To "9"
                ' Do nothing
            Case "a" To "z"
                e.KeyChar = Char.ToUpper(e.KeyChar)
            Case Else
                e.Handled = True
        End Select
    ElseIf Not e.KeyChar = Convert.ToChar(8) Then

        e.KeyChar = ""
        End If


        Dim strKeyTextField As String = aKeyTextField.Text
        Dim n As Integer = 5
    Dim intlength As Integer = aKeyTextField.TextLength

    If Not e.KeyChar = Convert.ToChar(8) Then

        While intlength > 4 And intlength < 29

            If aKeyTextField.Text.Length = 5 Then
                strKeyTextField = strKeyTextField.Insert(5, "-")

            End If

            Dim singleChar As Char
            singleChar = strKeyTextField.Chars(n)

            While (n + 5) < intlength

                If singleChar = "-" Then
                    n = n + 6

                    If n = intlength Then
                        strKeyTextField = strKeyTextField.Insert(n, "-")
                    End If
                End If

            End While

            intlength = intlength - 5
        End While
        aKeyTextField.Text = strKeyTextField

        'sets focus at the end of the string
        aKeyTextField.Select(aKeyTextField.Text.Length, 0)


    Else

        Select Case aKeyTextField.Text.Length
            Case 7
                strKeyTextField = strKeyTextField.Remove(5, 1)
            Case 13
                strKeyTextField = strKeyTextField.Remove(11, 1)
            Case 19
                strKeyTextField = strKeyTextField.Remove(17, 1)
            Case 25
                strKeyTextField = strKeyTextField.Remove(23, 1)
            Case Else



        End Select

        aKeyTextField.Text = strKeyTextField
        aKeyTextField.Select(aKeyTextField.Text.Length, 0)

    End If

End Sub

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Dim blankContextMenu As New ContextMenu
    aKeyTextField.ContextMenu = blankContextMenu


End Sub

【问题讨论】:

    标签: regex vb.net


    【解决方案1】:

    看看MaskedTextBox。您应该能够用很少的代码实现您的目标,并且不需要正则表达式。

    【讨论】:

    • 我喜欢这个,唯一的问题是,当没有文本时,它会留下永久的 - 和 _ 或空格,这会破坏我想要的确切效果。更糟糕的是,我可以将其用作备份。
    【解决方案2】:

    这行得通,它可能与整理和 cmets 有关,但我只是想看看我是否可以让这个工作:

    Private Sub aKeyTextField_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles aKeyTextField.KeyPress
        'Test only
        If Char.IsLetterOrDigit(e.KeyChar) Then
            Dim test As String = ""
            Select Case e.KeyChar
                Case "0" To "9"
                    ' Do nothing
                Case "a" To "z"
                    e.KeyChar = Char.ToUpper(e.KeyChar)
                Case Else
                    e.Handled = True
            End Select
        Else
            e.KeyChar = ""
        End If
    
    
        Dim strKeyTextField As String = aKeyTextField.Text
        Dim n As Integer = 5
        Dim intlength As Integer = aKeyTextField.TextLength
        While intlength > 4
    
            If aKeyTextField.Text.Length = 5 Then
                strKeyTextField = strKeyTextField.Insert(5, "-")
    
            End If
    
            Dim singleChar As Char
            singleChar = strKeyTextField.Chars(n)
    
            While (n + 5) < intlength
    
                If singleChar = "-" Then
                    n = n + 6
    
                    If n = intlength Then
                        strKeyTextField = strKeyTextField.Insert(n, "-")
                    End If
                End If
    
            End While
    
            intlength = intlength - 5
        End While
        aKeyTextField.Text = strKeyTextField
    
        'sets focus at the end of the string
        aKeyTextField.Select(aKeyTextField.Text.Length, 0)
    
    End Sub
    

    【讨论】:

    • 感谢您的陪伴,保罗!我相信这会满足我的需要,我只需要添加一些东西,以防有人右键单击并粘贴到字段中,而不是手动输入键。
    • 请我帮忙,我知道解决方案远非完美,因为您无法删除,但我相信您可以添加另一个案例来轻松处理此问题。粘贴问题将需要我认为的另一种方法,祝你好运
    • 我最终添加了退格功能并禁用了用于粘贴的上下文菜单。由于发送键方法阻止了 CTRL + V ,它已经被禁用。将来,如果可能的话,我宁愿编辑粘贴而不是拒绝它,但这很好地满足了需求。
    【解决方案3】:

    我建议不要在 TextBoxTextChangedEvent 上执行此操作,而是在您支持文本框的属性的 Set 方法中处理此问题。

    【讨论】:

      【解决方案4】:

      看来你这里的 ^ 放错了位置,它需要在方括号内,同时删除 {5}-,这将删除所有非字母数字字符。

       If m.Success Then
                  aKeyTextField.Text = Regex.Replace(aKeyTextField.Text, "[^a-zA-Z0-9]+, "")"
                  aKeyTextField.SelectionStart = aKeyTextField.TextLength
       End If
      

      下面的代码只会在第 5 个位置放置一个 -,您需要将它添加到每 5 个字符,创建一个循环/获取长度并除以 5,然后每 5 个位置添加一个“-”。

      If aKeyTextField.TextLength > 5 Then
      
              aKeyTextField.Text = aKeyTextField.Text.Insert(5, "-")
              aKeyTextField.SelectionStart = aKeyTextField.TextLength
      
        End If
      

      这样的东西可以代替:

      Dim n As Integer = 5
              Dim intlength As Integer = aKeyTextField.Length
              While intlength > 0 And n < intlength
                  aKeyTextField = aKeyTextField.Insert(n, "-")
                  intlength = intlength - 5
                  n = n + 6
              End While
      

      要停止无限循环,请将事件更改为 Validating:

      Private Sub aKeyTextField_TextValidating(ByVal sender As Object, ByVal e As System.EventArgs) Handles aKeyTextField.Validating
      

      【讨论】:

      • 我没有意识到插入问题,所以很高兴您指出了这一点。我没有注意到的主要原因是因为我永远无法做到那么远。当我到达第 5 个字符时,按原样运行此代码会创建一个无限循环。 RegEx 删除特殊字符并添加破折号的问题在于它正在创建一个无限循环,我需要绕过这个无限循环。整个 {5} 和搞砸的 ^ 是在我尝试修复它的过程中,我只是忘了改回来。
      • 我在 Visual Studio 中运行了上面的代码(不使用文本框),但只是传入了一个带有一些非字母数字字符的字符串,我的代码运行良好并删除了所有字符,然后循环遍历并放置a - 每 5 个字符。我在任何时候都没有无限循环?
      • 问题是它在'textchanged'下运行,所以只要文本框发生变化,包括删除特殊字符或添加破折号,它就会改变文本并再次运行。
      • 我明白了,你不能添加一个标志,让它只运行一次正则表达式代码吗?
      • @Zachet,使用验证事件更新了我的答案,经过测试并且没有无限循环! Even 只会在你跳出文本框后触发一次
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2011-04-29
      • 2020-02-26
      • 1970-01-01
      • 2014-09-10
      • 2016-12-21
      • 1970-01-01
      相关资源
      最近更新 更多