2010-01-15 36 views
0

我想以某種方式格式化我的文本框,以便用戶不能輸入任何符號例如(),。 ; '「£$%^ [] {}在VB.net中的文本框格式

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

End if 

該代碼將阻止用戶進入數字或整數。但我怎麼能防止信號?

在此先感謝。

+0

不要忘記,如果他們複製和 - 用它在你的表格粘貼到文本框中,您的代碼不會拾取單個字符,因此不要單獨依靠此代碼進行驗證。 – MartW 2010-01-15 13:07:24

+0

通常情況下最好是說什麼是允許的,而不是@klausbyskov發佈的內容。就像一個俱樂部的保鏢一樣,而不是「不要讓愛麗絲進來,或者鮑勃,或者查理......」更容易說「這些(x)人可以進來,沒有其他人」。 – 2010-01-15 15:38:16

回答

1

如何

Not Char.IsLetter(e.KeyChar) 

0

您也可以使用AJAX的討論 「屏蔽編輯」。Ajax控件工具包可

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

安裝的Ajax:在找到。按照網站上提供的關於如何將AJAX控件添加到我的Visual Studio的步驟。之後,將「MaskedEditExtender」控件拖到您想要格式化的文本框中。

在屬性字段中,說「面具」我打(999)999-9999

這個我發現我不得不添加一種叫「TollkitScriptManager」在設計視圖,拖放上面的控制後txtbox是你想要格式化的文本框。我不認爲你必須改變任何屬性,我相信這個控件必須在你想要格式化的文本框之上。

這可能是也可能不是你正在尋找的,但它會允許一個非常特定的格式文本框,並強制用戶只輸入數字或任何你選擇的。這對格式化文本框中的電話號碼非常有用。

0

我寫了一個簡單的類來做到這一點在previous question。這裏是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