[英]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.