![](/img/trans.png)
[英]Allow user to write only one dot And only numbers in a textbox VB.NET 2010
[英]How to allow user to enter only numbers in a textbox in vb.net?
如何阻止用戶輸入字符,但只能輸入數字和'。' 在vb.net 2005的文本框中?
以下內容允許您測試特定的鍵值(來自http://www.daniweb.com/forums/thread127299.html ):
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
If (Microsoft.VisualBasic.Asc(e.KeyChar) < 48) _
Or (Microsoft.VisualBasic.Asc(e.KeyChar) > 57) Then
e.Handled = True
End If
If (Microsoft.VisualBasic.Asc(e.KeyChar) = 8) Then
e.Handled = False
End If
End Sub
如果這不是您要找的,請嘗試使用isNumeric()
函數。
只是為了幫助,我有一個片段,我正在制作一個可能有用的計算器,它允許刪除,退格,數字和'。' 焦炭。 您還可以添加對函數的調用,以便在按Enter鍵時處理文本框。
Private Sub Box_Input_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles Box_Input.KeyDown
If Char.IsDigit(Chr(e.KeyValue)) Or _
Chr(e.KeyValue) = "¾"c Or _
e.KeyData = Keys.Delete Or _
e.KeyData = Keys.Back Then
If Chr(e.KeyValue) = "¾"c Then
If Box_Input.Text.Contains(".") Then
e.SuppressKeyPress = True
Else
e.SuppressKeyPress = False
End If
End If
ElseIf e.KeyData = Keys.Enter Then
`State a call to function for when Enter is pressed`
Else
e.SuppressKeyPress = True
End If
End Sub
此代碼允許輸入所有數字,后退空格和刪除鍵以及僅允許一個'。' 在文中。 一個想法可能是添加TAB功能以允許Tab停止。
Dim num1 As Integer
Try
num1 = Cint(TextBox1.Text)
Catch ex As Exception
TextBox1.Clear()
TextBox1.Focus()
End Try
對於單個數字,您可以使用num1 = Csng(textbox1.text)
嘗試這個;
Dim Validinputchar = "0123456789." + vbBack
If Not Validinputchar.Contains(e.KeyChar) Then
e.KeyChar = Nothing
End If
Validinputchar
變量僅包含您希望用戶在文本框中輸入的字符。
注意:代碼應放在textbox_keypress
事件下
嘗試這個:
Sub TB_Press(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
If Not Char.IsDigit(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then
e.Handled = True
End If
End Sub
但是這只允許數字,你可以接受添加這個條件的十進制數字:
If e.KeyChar <> decSeparator AndAlso _
Not CType(sender, TextBox).Text.Contains(decSeparator) Then
你可以得到小數分隔符:
Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
另一個簡單的選擇是這樣做:
Sub TB_Press(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
Dim text As String = Ctype(sender, TextBox).Text
e.Handled = Double.TryParse(text, New Double)
End Sub
我寫了一個傻瓜證明程序,它消除了Alpha字符並允許所有其他字符。
您可以在技術上將所需的任何字符放在字符串中,以防止它像標點符號一樣輸入。
Private Sub checkIfNumber(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles tbReOrderAmount.KeyDown
Dim disallowedKeys As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
If Boolean.Parse(disallowedKeys.Contains(e.KeyCode.ToString)) Then
e.SuppressKeyPress = True
End If
End Sub
這是一種很好的簡潔方法,可以防止在您選擇的任何文本框或字段中輸入disallowedKeys字符串中的任何字符,只需讓控件的KeyDown事件引用此方法即可。
以下是我的意見中的更好答案:
Private Sub txtScale_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtScale.KeyPress
If IsNumeric(txtScale.Text + e.KeyChar) = False Then e.Handled = True
End Sub
歡呼聲,薩克斯
在stackoverflow和其他地方搜索了幾個結果后,我對我發現的解決方案不滿意:它們都有某種缺點,主要是鍵盤布局問題或控制鍵處理不正確,例如Ctrl + C不再可能。
我嘗試過的解決方案都采用了KeyDown / Up方法; 我決定嘗試TextChanged事件並實現簡單邏輯:如果當前輸入未驗證,則將其替換為舊值; else:更新舊值。
當然 - 一如既往 - 實現功能細節變得有點復雜:o | ...但最后我現在有一個TextBox,它可以限制在指定范圍內的整數或雙精度值,並且有一個新事件,ApplyValue,可以被監聽 - 而不是TextChanged或Validated - 這是取決於在所選擇的樣式上,即數字值不應在鍵入時觸發事件,但對於某些文本值,可能需要。
'nuff說,這里是控件的完整代碼,我想與絕對驚人的stackoverflow社區分享 - 我的第一個貢獻; o)我希望它對某人有用!
Imports System.ComponentModel
Public Class RestrictedTextbox
Inherits Windows.Forms.TextBox
#Region "Constructor, StyleEnum, ApplyValue event"
Public Sub New()
MyBase.New()
End Sub
'use enum instead of flags because of the overhead for creating a UiTypeEditor
Public Enum StyleEnum
[Integer]
IntegerZero
[Double]
DoubleZero
TextOnChange
TextOnValidate
End Enum
Public Event ApplyValue(sender As Object, e As System.EventArgs)
#End Region
#Region "New Properties"
Private _style As StyleEnum = StyleEnum.TextOnValidate
<Category("Restrictions"), _
Description("Determines input validation, alignment and when the ApplyValue event is raised"), _
Browsable(True), DefaultValue(StyleEnum.TextOnValidate)> _
Public Shadows Property Style As StyleEnum
Get
Return _style
End Get
Set(value As StyleEnum)
_style = value
initializeText()
End Set
End Property
Private _min As Integer = 0
<Category("Restrictions"), _
Description("Minimum value (for numeric styles)"), _
Browsable(True), DefaultValue(0)> _
Public Property Minimum As Integer
Get
Return _min
End Get
Set(value As Integer)
_min = value
initializeText()
End Set
End Property
Private _max As Integer = 2147483647
<Category("Restrictions"), _
Description("Maximum value (for numeric styles)"), _
Browsable(True), DefaultValue(2147483647)> _
Public Property Maximum As Integer
Get
Return _max
End Get
Set(value As Integer)
_max = value
initializeText()
End Set
End Property
#End Region
#Region "Shadow properties"
'hide and do not allow changing
<Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Shadows Property TextAlign As Windows.Forms.HorizontalAlignment
Get
Return MyBase.TextAlign
End Get
Set(value As Windows.Forms.HorizontalAlignment)
'do nothing
End Set
End Property
'hide and always use false
<Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Shadows Property Multiline As Boolean
Get
Return False
End Get
Set(value As Boolean)
MyBase.Multiline = False
End Set
End Property
'hide and always use true
<Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Shadows Property CausesValidation As Boolean
Get
Return True
End Get
Set(value As Boolean)
MyBase.CausesValidation = True
End Set
End Property
'hide, but emulate default
<Browsable(False), EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Shadows Property Lines As String()
Get
Return MyBase.Lines
End Get
Set(value As String())
MyBase.Lines = value
End Set
End Property
#End Region
#Region "validateText, initializeText"
Private _oldText As String = ""
Private nfi As System.Globalization.NumberFormatInfo = New System.Globalization.NumberFormatInfo With {.CurrencyDecimalSeparator = "."}
Private Sub initializeText()
Dim def As String = ""
Select Case _style
Case StyleEnum.TextOnChange, StyleEnum.TextOnValidate
MyBase.TextAlign = HorizontalAlignment.Left
def = ""
Case StyleEnum.Double, StyleEnum.Integer
MyBase.TextAlign = HorizontalAlignment.Right
def = ""
Case StyleEnum.DoubleZero, StyleEnum.IntegerZero
MyBase.TextAlign = HorizontalAlignment.Right
If _min < 0 And _max > 0 Then
def = "0"
Else
def = _min.ToString
End If
End Select
If Me.Text = "" Or Me.Text = "0" Or Not Me.validateText Then
Me.Text = def
End If
End Sub
Private Function validateText() As Boolean
Dim negativeOk As Boolean = False
Dim checkDouble As Boolean = False
Dim checkInteger As Boolean = False
Dim valueOk As Boolean = False
Select Case _style
Case StyleEnum.Double, StyleEnum.DoubleZero
checkDouble = True
Case StyleEnum.Integer, StyleEnum.IntegerZero
checkInteger = True
Case StyleEnum.TextOnChange, StyleEnum.TextOnValidate
valueOk = True
End Select
If Not valueOk Then
Dim txt As String = Me.Text
If String.IsNullOrEmpty(txt) Then
valueOk = True
ElseIf _min < 0 And txt = "-" Then
valueOk = True
Else
Dim tmp As Double = 0
If checkDouble Then
valueOk = Double.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp)
ElseIf checkInteger Then
valueOk = Integer.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp)
End If
If valueOk And ((tmp > _max) Or ((tmp < _min) And (tmp.ToString.Length >= _min.ToString.Length))) Then
'if value could be parsed, but
'value is too large or
'value is too small, even though the length is sufficient (to allow entering incomplete numbers, e.g. "2", if _min=10)
'NOTE: too small numbers will be caught in validation event
valueOk = False
End If
End If
End If
Return valueOk
End Function
#End Region
#Region "Events"
Private Sub WdTextbox_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged
Dim valueOk As Boolean = Me.validateText
If Not valueOk Then
Dim oldPos As Integer = Me.SelectionStart
Me.Text = _oldText
If (oldPos > 0) Then
Me.SelectionStart = oldPos - 1
End If
Else
Me._oldText = Text
If Me._style = StyleEnum.TextOnChange Then
RaiseEvent ApplyValue(Me, New System.EventArgs)
End If
End If
End Sub
Private Sub WdTextbox_Validating(sender As Object, e As CancelEventArgs) Handles Me.Validating
Dim txt As String = Me.Text
Dim raise As Boolean
Select Case _style
Case StyleEnum.Double, StyleEnum.Integer
Dim tmp As Double = 0
If Double.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp) Then
If tmp < _min Then
tmp = _min
ElseIf tmp > _max Then
tmp = _max
End If
Me.Text = IIf(tmp <> 0, tmp.ToString, "")
Else
Me.Text = ""
End If
raise = True
Case StyleEnum.DoubleZero, StyleEnum.IntegerZero
Dim tmp As Double = 0
If Double.TryParse(txt, Globalization.NumberStyles.Float, nfi, tmp) Then
If tmp < _min Then
tmp = _min
ElseIf tmp > _max Then
tmp = _max
End If
Me.Text = tmp.ToString
Else
Me.Text = "0"
End If
raise = True
Case StyleEnum.TextOnChange
raise = False
Case StyleEnum.TextOnValidate
raise = True
End Select
If raise Then
RaiseEvent ApplyValue(Me, New System.EventArgs)
End If
End Sub
#End Region
End Class
在TextBox1_KeyPress之間填充此代碼
If Char.IsDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then e.Handled = true MsgBox("Please enter a valid number") End If
您可以使用KeyDown事件來檢查按下的鍵的值是否為數字或“。” 並在輸入為數字或“。”時將event屬性設置為true。 (我可能錯誤處理屬性的值,因為我不記得丟棄事件是否為真或假,並阻礙了輸入到文本框中的鍵)
看看ErrorProvider 。 使用它可以防止焦點離開控制,直到輸入正確的值,同時允許用戶按取消或對話框關閉按鈕。
這有效
Private Sub txt1_PreviewTextInput(sender As Object, e As TextCompositionEventArgs) Handles txt1.PreviewTextInput
e.Handled = Not IsNumeric(e.Text)
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.