Imports System.Windows.Forms Imports System.Text.RegularExpressions Public Class NumericTextBox Inherits TextBox Public Sub New() MyBase.New() '组件设计器需要此调用。 InitializeComponent() Me.IsSeparate = True Me.IsDecimal = True Me.DecimalNumber = 2 Me.TextAlign = HorizontalAlignment.Right End Sub Private blPress As Boolean = True ''' <summary> ''' 是否有千位分隔符 ''' </summary> ''' <remarks></remarks> Private m_isSeparate As Boolean = True Public Property IsSeparate() As Boolean Get Return m_isSeparate End Get Set(ByVal value As Boolean) m_isSeparate = value End Set End Property ''' <summary> ''' 小数位位数 ''' </summary> ''' <remarks></remarks> Private mDecimalNumber As Integer = 0 Public Property DecimalNumber() As Integer Get Return mDecimalNumber End Get Set(ByVal value As Integer) If IsDecimal Then mDecimalNumber = value Else mDecimalNumber = 0 End If End Set End Property ''' <summary> ''' TextBox的Text的值去掉千位分割符“,” ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Overrides Property Text() As String Get Return MyBase.Text.Replace(",", "") End Get Set(ByVal value As String) MyBase.Text = value End Set End Property ''' <summary> ''' 取得TextBox显示的值 ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Private ReadOnly Property ShowText() As String Get Return MyBase.Text End Get End Property ''' <summary> ''' 是否允许输入小数 ''' </summary> ''' <remarks></remarks> Private mIsDecimal As Boolean = True Public Property IsDecimal() As Boolean Get Return mIsDecimal End Get Set(ByVal value As Boolean) mIsDecimal = value End Set End Property ''' <summary> ''' 对输入的数据进行验证,符合的显示在TextBox中 ''' </summary> ''' <param name="e"></param> ''' <remarks></remarks> Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs) If Not IsDecimal Then If Not IsNumeric(e.KeyChar) OrElse e.KeyChar = "." Then e.Handled = True End If ElseIf IsNumeric(e.KeyChar) OrElse e.KeyChar = "." Then Dim strCash As String If Me.SelectionLength > 0 Then strCash = Me.ShowText.Remove(Me.SelectionStart, Me.SelectionLength) Else strCash = Me.ShowText.Trim End If strCash = strCash.Insert(Me.SelectionStart, e.KeyChar) If strCash.Contains(".") Then If DecimalNumber <= strCash.Substring(strCash.IndexOf(".")).Length - 2 Then e.Handled = True '用正则表达式防止输入多个“.” ElseIf Not Regex.IsMatch(strCash.Replace(",", ""), "^/d+/.?(/d+)?$") Then e.Handled = True End If End If ElseIf Not Asc(e.KeyChar) = Keys.Back Then e.Handled = True End If MyBase.OnKeyPress(e) End Sub ''' <summary> ''' 焦点离开的时候,格式化数据 ''' </summary> ''' <param name="e"></param> ''' <remarks></remarks> Protected Overrides Sub OnLeave(ByVal e As System.EventArgs) If IsSeparate Then If Not Me.Text.Trim.Length = 0 Then Dim strNumFormat As String = "{0:#,##0." & New String("0", DecimalNumber) & "}" Me.Text = String.Format(strNumFormat, CDec(Me.Text)) End If End If MyBase.OnLeave(e) End Sub End Class