如何阻止用户输入字符,但只能输入数字和'。'在vb.net 2005的文本框中?
答案 0 :(得分:9)
以下内容允许您测试特定的键值(来自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()
功能。
答案 1 :(得分:5)
只是为了帮助,我有一个片段,我正在制作一个可能有用的计算器,它允许删除,退格键,数字和'。'焦炭。您还可以添加对函数的调用,以便在按下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停止。
答案 2 :(得分:1)
Dim num1 As Integer
Try
num1 = Cint(TextBox1.Text)
Catch ex As Exception
TextBox1.Clear()
TextBox1.Focus()
End Try
对于单个号码,您可以使用num1 = Csng(textbox1.text)
答案 3 :(得分:1)
试试这个;
Dim Validinputchar = "0123456789." + vbBack
If Not Validinputchar.Contains(e.KeyChar) Then
e.KeyChar = Nothing
End If
Validinputchar
变量仅包含您希望用户在文本框中输入的字符。
注意:代码应放在textbox_keypress
事件
答案 4 :(得分:0)
您可以使用KeyDown事件检查按下的键的值是否为数字或“。”并在输入为数字或“。”时将event属性设置为true。 (我可能错误处理属性的值,因为我不记得丢弃事件是否为真或假,并阻碍了输入文本框的键)
答案 5 :(得分:0)
查看ErrorProvider。使用它可以防止焦点离开控制,直到输入正确的值,同时允许用户按下取消或对话框关闭按钮。
答案 6 :(得分:0)
试试这个:
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
答案 7 :(得分:0)
我写了一个傻瓜证明程序,它消除了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事件引用此方法即可。
答案 8 :(得分:0)
以下是我的意见中的更好答案:
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
干杯上,Sach
答案 9 :(得分:0)
在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
答案 10 :(得分:0)
在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
答案 11 :(得分:0)
这有效
Private Sub txt1_PreviewTextInput(sender As Object, e As TextCompositionEventArgs) Handles txt1.PreviewTextInput
e.Handled = Not IsNumeric(e.Text)
End Sub