繁体   English   中英

VB.net 中的文本框格式

[英]Textbox formatting in VB.net

我想以某种方式格式化我的文本框,以便用户无法输入任何符号,例如 () , . ; ' "£ $ % ^[]{}

If (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or (e.KeyChar = ".")) Then
             e.Handled = True

End if

此代码将阻止用户输入数字或整数。 但是我怎样才能防止符号呢?

提前致谢。

怎么样

Not Char.IsLetter(e.KeyChar)

?

您还可以使用 Ajax 中的“屏蔽编辑”。 可以在以下位置找到 Ajax 控件工具包:

http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/MaskedEdit/MaskedEdit.aspx

安装 Ajax。 按照网站上提供的有关如何将 AJAX 控件添加到我的 Visual Studio 的步骤进行操作。 之后,将“MaskedEditExtender”控件拖到要格式化的文本框。

在显示“掩码”的属性字段中,我输入了 (999) 999-9999

在此之后,我发现我必须添加一个名为“TollkitScriptManager”的东西在设计视图中,将控件拖放到 txtbox 上方,这是您要在其中完成格式设置的文本框。我认为您不必更改任何属性对此,我相信此控件必须位于您要设置格式的文本框上方。

这可能是也可能不是您要查找的内容,但它将允许使用非常特定的文本框格式并强制用户仅输入数字或您选择的任何内容。 这对于格式化文本框中的电话号码非常有用。

我在上一个问题中编写了一个简单的类来执行此操作。 这是代码的 VB.NET 版本:

Public Class TextBoxFilter
    <Flags()> Public Enum Filters
        None = 0
        Text = 1
        Numbers = 2
        AlphaNumeric = Filters.Text Or Filters.Numbers
        Currency = 4
        All = Filters.Text Or Filters.Numbers Or Filters.Currency
    End Enum

    Dim _keyFilter As Dictionary(Of TextBox, Filters)
    Dim _allowedKeys As Dictionary(Of TextBox, String)
    Dim _invalidKeys As Dictionary(Of TextBox, String)
    Dim _keyEventArgs As Dictionary(Of TextBox, Windows.Forms.KeyEventArgs)

    Private Shared DecimalMark As String = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
    Private Shared NegativeMark As String = Application.CurrentCulture.NumberFormat.NegativeSign
    Private Shared CurrencySymb As String = Application.CurrentCulture.NumberFormat.CurrencySymbol
    Private Shared CurrencyDecimal As String = Application.CurrentCulture.NumberFormat.CurrencyDecimalSeparator


    Public Sub New()
        _keyFilter = New Dictionary(Of TextBox, Filters)
        _allowedKeys = New Dictionary(Of TextBox, String)
        _invalidKeys = New Dictionary(Of TextBox, String)
        _keyEventArgs = New Dictionary(Of TextBox, KeyEventArgs)
    End Sub

    'set & remove filter'

    Public Sub SetTextBoxFilter(ByVal textBox As TextBox, ByVal filter As Filters)
        SetTextBoxFilter(textBox, filter, AllowedKeys(textBox), InvalidKeys(textBox))
    End Sub

    Public Sub SetTextBoxFilter(ByVal textBox As TextBox, ByVal allowedKeys As String)
        SetTextBoxFilter(textBox, Filter(textBox), allowedKeys, InvalidKeys(textBox))
    End Sub

    Public Sub SetTextBoxFilter(ByVal textBox As TextBox, _
     ByVal allowedKeys As String, ByVal invalidKeys As String)

        SetTextBoxFilter(textBox, Filter(textBox), allowedKeys, invalidKeys)
    End Sub

    Public Sub SetTextBoxFilter(ByVal textBox As TextBox, ByVal filter As Filters, _
     ByVal allowedKeys As String, ByVal invalidKeys As String)

        If Not _keyFilter.ContainsKey(textBox) Then
            'add the textbox and its filter if it does not exist in '
            'the collection of registered textboxes                 '
            _keyFilter.Add(textBox, filter)
            _allowedKeys.Add(textBox, allowedKeys)
            _invalidKeys.Add(textBox, invalidKeys)
            _keyEventArgs.Add(textBox, New System.Windows.Forms.KeyEventArgs(Keys.None))

            'add the event handlers                                 '
            AddHandler textBox.KeyDown, AddressOf KeyDownUp
            AddHandler textBox.KeyUp, AddressOf KeyDownUp
            AddHandler textBox.KeyPress, AddressOf KeyPress
            AddHandler textBox.Validating, AddressOf Validating
            AddHandler textBox.Disposed, AddressOf Disposed

        Else
            'change the filter of the textbox if it exists in       '
            'the collection of registered textboxes                 '
            _keyFilter(textBox) = filter
            _allowedKeys(textBox) = allowedKeys
            _invalidKeys(textBox) = invalidKeys
        End If
    End Sub

    Public Sub RemoveTextBoxFilter(ByVal textBox As TextBox)
        If _keyFilter.ContainsKey(textBox) Then
            _keyFilter.Remove(textBox)
            _allowedKeys.Remove(textBox)
            _invalidKeys.Remove(textBox)
            _keyEventArgs.Remove(textBox)

            RemoveHandler textBox.KeyDown, AddressOf KeyDownUp
            RemoveHandler textBox.KeyUp, AddressOf KeyDownUp
            RemoveHandler textBox.KeyPress, AddressOf KeyPress
            RemoveHandler textBox.Validating, AddressOf Validating
            RemoveHandler textBox.Disposed, AddressOf Disposed
        End If
    End Sub

    Public Function ContainsTextBox(ByVal textBox As TextBox) As Boolean
        Return _keyFilter.ContainsKey(textBox)
    End Function

    'properties'

    Public Property Filter(ByVal textBox As TextBox) As Filters
        Get
            If ContainsTextBox(textBox) Then
                Return _keyFilter.Item(textBox)
            Else
                Return Filters.None
            End If
        End Get
        Set(ByVal value As Filters)
            SetTextBoxFilter(textBox, value)
        End Set
    End Property

    Public Property AllowedKeys(ByVal textBox As TextBox) As String
        Get
            If ContainsTextBox(textBox) Then
                Return _allowedKeys(textBox)
            Else
                Return ""
            End If
        End Get
        Set(ByVal value As String)
            SetTextBoxFilter(textBox, Me.Filter(textBox), value, Me.InvalidKeys(textBox))
        End Set
    End Property

    Public Property InvalidKeys(ByVal textBox As TextBox) As String
        Get
            If ContainsTextBox(textBox) Then
                Return _invalidKeys(textBox)
            Else
                Return ""
            End If
        End Get
        Set(ByVal value As String)
            SetTextBoxFilter(textBox, Me.Filter(textBox), Me.AllowedKeys(textBox), value)
        End Set
    End Property

    'event handlers'

    Private Sub Disposed(ByVal sender As Object, ByVal e As System.EventArgs)
        RemoveTextBoxFilter(DirectCast(sender, TextBox))
    End Sub

    Private Sub KeyDownUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        'assign the modifiers'
        _keyEventArgs(DirectCast(sender, TextBox)) = e
    End Sub

    Private Sub KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
        'ensure key pressed is in the allowed keys'

        Dim txt = DirectCast(sender, TextBox)
        Dim c = e.KeyChar
        Dim allowKey As Boolean = IsValidChar(txt, c, txt.SelectionStart)


        'check for backspace & Ctrl combinations if the allowKey is still false'
        If allowKey = False Then
            If _keyEventArgs(txt).Control Then
                'control modifier goes with A, X, C, V and Z for '
                'Select All, Cut, Copy, Paste and Undo respectively'
                Dim key = _keyEventArgs(txt).KeyCode
                allowKey = (key = Keys.A OrElse key = Keys.X OrElse _
                   key = Keys.C OrElse key = Keys.V OrElse key = Keys.Z)

            ElseIf _keyEventArgs(txt).KeyCode = Keys.Back Then
                'allow the backspace key'
                allowKey = True
            End If
        End If


        'disable the key if it was not valid'
        If Not allowKey Then
            e.Handled = True
            Beep()
        End If
    End Sub

    Private Sub Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
        Dim box = DirectCast(sender, TextBox)
        Dim boxFlags = _keyFilter(box)

        'skip validation if the textbox allows all entries or there is no text'
        If boxFlags = Filters.All Or box.Text = "" Then Exit Sub

        'otherwise check the characters entered'
        Dim txtChars = box.Text.ToCharArray

        Dim isValidEntry As Boolean = False

        'check each caracter for an invalid entry'
        For i = 0 To txtChars.Length - 1
            Dim c = txtChars(i)
            isValidEntry = IsValidChar(box, txtChars(i), i)

            If Not isValidEntry Then
                box.Select(i, 1)
                Exit For
            End If
        Next

        If Not isValidEntry Then e.Cancel = True

        If Not isValidEntry Then
            MsgBox("The text entered is invalid for the format " & boxFlags.ToString & "." & _
             If(_allowedKeys(box) <> "", vbCrLf & "Additional Allowed Keys: " & _allowedKeys(box), "") & _
             If(_invalidKeys(box) <> "", vbCrLf & "Additional Invalid Keys: " & _invalidKeys(box), ""), _
             MsgBoxStyle.Critical, "Invalid Entry")
        End If
    End Sub

    Private Function IsValidChar(ByVal textBox As TextBox, ByVal c As Char, ByVal charIndex As Integer) As Boolean
        'ensure key pressed is in the allowed keys '

        Dim pF = _keyFilter(textBox)
        Dim aK = _allowedKeys(textBox)
        Dim iK = _invalidKeys(textBox)
        Dim shouldAllow As Boolean = False


        'if filter is set to all, return true unconditionally '
        If pF = Filters.All Then Return True


        'check preset filters '

        'check for text '
        If EnumHasFlag(pF, Filters.Text) Then
            If Not Char.IsDigit(c) Then
                shouldAllow = True
            Else
                'if the character is a digit, check for the number flag (AlphaNumerics) '
                If EnumHasFlag(pF, Filters.Numbers) Then
                    shouldAllow = True
                End If
            End If

        End If

        'check for numbers '
        If shouldAllow = False AndAlso EnumHasFlag(pF, Filters.Numbers) Then
            If Char.IsDigit(c) Then
                shouldAllow = True
            ElseIf DecimalMark.Contains(c) Then
                'allow the decimal if there is no decimal in the textbox's
                'text or the selected text contains the mark'
                If Not textBox.Text.Contains(c) OrElse textBox.SelectedText.Contains(c) Then
                    shouldAllow = True
                End If
            ElseIf NegativeMark.Contains(c) AndAlso _
              (charindex <= NegativeMark.IndexOf(c)) Then
                'allow the negative mark if we are at the start of the'
                'textbox'
                shouldAllow = True
            End If

        End If

        'check for currency '
        If shouldAllow = False AndAlso EnumHasFlag(pF, Filters.Currency) Then
            If Char.IsDigit(c) Then
                shouldAllow = True
            ElseIf CurrencyDecimal.Contains(c) Then
                'allow the currency decimal mark if it does not exist in the '
                'textbox''s text or the selected text contains the mark '
                If Not textBox.Text.Substring(0, charIndex).Contains(c) OrElse _
                  textBox.SelectedText.Contains(c) Then
                    shouldAllow = True
                End If
            ElseIf CurrencySymb.Contains(c) AndAlso _
              (charIndex <= CurrencySymb.IndexOf(c)) Then
                'allow the currency symbol if we are in a valid position'
                shouldAllow = True
            End If

        End If



        'now check for extra allowed keys'
        If Not shouldAllow Then
            shouldAllow = aK.Contains(c)
        End If

        'and then check for extra invalid keys'
        If shouldAllow AndAlso iK.Contains(c) Then
            shouldAllow = False
        End If


        Return shouldAllow
    End Function

    <System.Diagnostics.DebuggerStepThrough()> _
     Private Function EnumHasFlag(ByVal value As [Enum], ByVal flag As [Enum]) As Boolean
        Return (Convert.ToInt64(value) And Convert.ToInt64(flag)) = Convert.ToInt64(flag)
    End Function
End Class

只需将这个类放在您的项目中并在您的表单中使用它,如下所示

Public Class Form1 

    Dim filter = New TextBoxFilter()

    Private Sub Form1_Load(object sender, System.EventArgs e) Handles MyBase.Load
        filter.SetTextBoxFilter(TextBox1, TextBoxFilter.Filters.Numbers)
    End Sub
End Class

你可以使用像这样的模式属性

 txtTel.Attributes.Add("placeholder", FormatTel.Libelle)
 txtTel.Attributes.Add("title", FormatTel.Libelle)
 txtTel.Attributes.Add("pattern", FormatTel.ExprReg)

我建议使用正则表达式(正则表达式)。 您需要做的是检查用户输入的每个字符。 如果字符无效,您必须用有效字符替换它们。 正则表达式模式 "[^!@%&$#()*^\\0-9.+-=][_]" 匹配字母字符和空格。 上述模式中的符号 ^ 表示不匹配以下任何字符。 符号 \\ 是一个 scape 字符, [] 表示匹配的字符范围。 如果字符串与上述模式匹配,您必须用有效字符替换用户输入的字符。

在下面的代码中,每次用户输入一个新字符时,都会检查用户输入的无效字符。

要使代码正常工作,您必须导入以下命名空间:

    Imports System.Text.RegularExpressions

windows窗体的完整代码在这里:

Imports System.Text.RegularExpressions
Public Class RegexTest
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        Dim theText As String = Me.TextBox1.Text
        Dim cursor1 As Integer = Me.TextBox1.SelectionStart
        Dim cursor2 As Integer = cursor1
        Dim finalText As String = ""
        If theText IsNot Nothing AndAlso theText.Length >= 1 Then
            For x As Integer = 0 To theText.Length - 1 Step +1
                Dim Letter As String = theText.Substring(x, 1)
                Dim extStr As String = ExtractFirstString(Letter, "[^!@%&\$#\(\)\*\^\\0-9\.\+\-=\]\[_]")
                If extStr <> Letter Then
                    extStr = ""
                    finalText &= extStr
                Else
                    finalText &= Letter
                End If
            Next
        End If
        If finalText <> theText Then
            Me.TextBox1.Text = finalText
            Me.TextBox1.SelectionStart = cursor2
        End If
    End Sub


    Private Function ExtractFirstString(ByVal sourceStr As String, ByVal pattern As String) As System.String
        Dim mc As System.Text.RegularExpressions.MatchCollection
        Dim result As String = Nothing
        Dim i As Integer
        Dim brk As Boolean = False
        If sourceStr IsNot Nothing Then
            ' match email addresses!
            mc = Regex.Matches(sourceStr, pattern)
            If mc IsNot Nothing Then
                Dim results(mc.Count - 1) As String
                For i = 0 To results.Length - 1 Step +1
                    result = mc(i).Value
                    brk = True
                    Return result
                    Exit For 'only return the first match
                Next
            End If
        End If
        Return Nothing
    End Function
End Class

您必须在表单上创建一个名为 TextBox1 的文本框并处理其 TextChanged evnet。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM