做了个数值输入文本框(支持类型、最大值、最小值),尚不支持拷贝、剪切、粘帖,
做了个数值输入文本框(支持类型、最大值、最小值),尚不支持拷贝、剪切、粘帖,请指教。
工作需要,制作了一个在Winform下的数值文本输入框,可以限制输入的内容符合数值要求,原本一直用正则表达式做这个,包括IP地址、手机号码等,但发现在数值输入时用正则比较耗费资源,固改成这个。不过在IP地址、手机号码等还是得继续用正则,而且必须要一个一个的字符进行判断,有时间再贴出来。如有改进的请务必回复,供我和大家参考学习,多谢多谢!
尤其是对剪切、粘帖、拷贝的支持,本人目前还毫无头绪。
工作需要,制作了一个在Winform下的数值文本输入框,可以限制输入的内容符合数值要求,原本一直用正则表达式做这个,包括IP地址、手机号码等,但发现在数值输入时用正则比较耗费资源,固改成这个。不过在IP地址、手机号码等还是得继续用正则,而且必须要一个一个的字符进行判断,有时间再贴出来。如有改进的请务必回复,供我和大家参考学习,多谢多谢!
尤其是对剪切、粘帖、拷贝的支持,本人目前还毫无头绪。
- VB.NET code
Public Class MyTextBox Inherits TextBox Private _InputNumericType As NumericType Private _MMaxValue As Double Private _MMinValue As Double Private _MaxValue As Double Private _MinValue As Double Private _TryParse As StringValidate Sub New(Optional ByVal inputformat As NumericType = NumericType.Integer) Me.InputNumericType = inputformat Me.ShortcutsEnabled = False End Sub Private Overloads Sub MyBase_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress Try If Char.IsControl(e.KeyChar) Then e.Handled = False ElseIf Char.IsDigit(e.KeyChar) OrElse e.KeyChar = "." OrElse e.KeyChar = "+" OrElse e.KeyChar = "-" Then Dim ValidString = Strings.Left(Me.Text, MyBase.SelectionStart) & e.KeyChar & Strings.Right(Me.Text, MyBase.Text.Length - Me.SelectionStart - Me.SelectionLength) If ValidString = "+" AndAlso Me._MaxValue > 0 Then e.Handled = False Exit Sub End If If ValidString = "-" AndAlso Me._MinValue < 0 Then e.Handled = False Exit Sub End If If ValidString.Length > 1 AndAlso _InputNumericType < NumericType.Single AndAlso (Strings.Left(ValidString, 1) = "0" OrElse Strings.Left(ValidString.Trim, 2) = "+0" OrElse Strings.Left(ValidString.Trim, 2) = "-0") Then e.Handled = True Exit Sub End If If ValidString.Length > 1 AndAlso _InputNumericType > NumericType.Int64 AndAlso (ValidString.Chars(0) = "0" AndAlso ValidString.Chars(1) <> ".") Then e.Handled = True Exit Sub End If If ValidString.Length > 2 AndAlso _InputNumericType > NumericType.Int64 AndAlso ((Strings.Left(ValidString, 2) = "+0" OrElse Strings.Left(ValidString.Trim, 2) = "-0") AndAlso ValidString.Chars(2) <> ".") Then e.Handled = True Exit Sub End If Dim DataValue As Double If _TryParse(ValidString, DataValue) Then If Not IsNothing(DataValue) AndAlso DataValue <= _MaxValue AndAlso DataValue >= _MinValue Then e.Handled = False Else e.Handled = True End If Else e.Handled = True End If Else e.Handled = True End If Catch ex As Exception MsgBox(ex.Message) End Try End Sub Public Property InputNumericType As NumericType Set(ByVal value As NumericType) Try Select Case value Case NumericType.Byte _TryParse = New StringValidate(AddressOf Byte.TryParse) _MMaxValue = Byte.MaxValue _MMinValue = Byte.MinValue Case NumericType.SByte _TryParse = New StringValidate(AddressOf SByte.TryParse) _MMaxValue = SByte.MaxValue _MMinValue = SByte.MinValue Case NumericType.Short, NumericType.Int16 _TryParse = New StringValidate(AddressOf Short.TryParse) _MMaxValue = Short.MaxValue _MMinValue = Short.MinValue Case NumericType.UShort, NumericType.UInt16 _TryParse = New StringValidate(AddressOf UShort.TryParse) _MMaxValue = UShort.MaxValue _MMinValue = UShort.MinValue Case NumericType.Integer, NumericType.Int32 _TryParse = New StringValidate(AddressOf Integer.TryParse) _MMaxValue = Integer.MaxValue _MMinValue = Integer.MinValue Case NumericType.Uinteger, NumericType.UInt32 _TryParse = New StringValidate(AddressOf UInteger.TryParse) _MMaxValue = UInteger.MaxValue _MMinValue = UInteger.MinValue Case NumericType.Long, NumericType.Int64 _TryParse = New StringValidate(AddressOf Long.TryParse) _MMaxValue = Long.MaxValue _MMinValue = Long.MinValue Case NumericType.Ulong, NumericType.UInt64 _TryParse = New StringValidate(AddressOf ULong.TryParse) _MMaxValue = ULong.MaxValue _MMinValue = ULong.MinValue Case NumericType.Single _TryParse = New StringValidate(AddressOf Single.TryParse) _MMaxValue = Single.MaxValue _MMinValue = Single.MinValue Case NumericType.Double _TryParse = New StringValidate(AddressOf Double.TryParse) _MMaxValue = Double.MaxValue _MMinValue = Double.MinValue Case NumericType.Decimal _TryParse = New StringValidate(AddressOf Decimal.TryParse) _MMaxValue = Decimal.MaxValue _MMinValue = Decimal.MinValue End Select _MaxValue = _MMaxValue _MinValue = _MMinValue Dim DataValue As Double If _TryParse(Me.Text, DataValue) Then If DataValue >= _MinValue AndAlso DataValue <= _MaxValue Then Me.Text = Me.Text Else Me.Text = "" End If Else Me.Text = "" End If _InputNumericType = value Catch ex As Exception MsgBox(ex.Message) End Try End Set Get Return _InputNumericType End Get End Property Public Property MaxValue As Double Set(ByVal value As Double) If value <= _MMaxValue AndAlso value >= _MMinValue AndAlso value >= _MinValue Then _MaxValue = value Else _MaxValue = _MMaxValue End If End Set Get Return _MaxValue End Get End Property Public Property MinValue As Double Set(ByVal value As Double) If value >= _MMinValue AndAlso value <= _MMaxValue AndAlso value <= _MaxValue Then _MinValue = value Else _MinValue = _MMinValue End If End Set Get Return _MinValue End Get End Property Public Overrides Property [Text] As String Set(ByVal value As String) If String.IsNullOrWhiteSpace(value) Then MyBase.Text = value Exit Property End If Dim DataValue As Double If _TryParse(value, DataValue) Then If DataValue >= _MinValue AndAlso DataValue <= _MaxValue Then MyBase.Text = value End If End If End Set Get Return MyBase.Text End Get End Property Delegate Function StringValidate(ByVal Str As String, ByRef result As Object) As Boolean End Class Public Enum NumericType [SByte] [Byte] [Short] [Int16] [UShort] [UInt16] [Integer] [Int32] [Uinteger] [UInt32] [Long] [Int64] [Ulong] [UInt64] [Single] [Double] [Decimal] End Enum