在网友的建议下,对0.1版作如下调整:
1) 增加常用验证选择功能
   目前增加的常用验证还比较少,我会慢慢搜集一些常用的正则表达式增加进去.
2) 增加边框颜色调整功能
   普通TextBox的边框颜色只能是黑色,本控件的边框颜色可由用户自己定义

自定义控件完整代码如下:

  1
  2增强TextBox' --------------------------------------------------------------------
  3增强TextBox'作者: hudan
  4增强TextBox'网址: http://www.cnblogs.com/hudan/
  5增强TextBox'版本: 0.2
  6增强TextBox'功能说明:
  7增强TextBox'    可以对文本框内容进行验证(通过正则表达式)的TextBox
  8增强TextBox'
  9增强TextBox'创建日期:  2005-05-01
 10增强TextBox'最后修改:  2005-05-05
 11增强TextBox
 12增强TextBox'变更历史记录
 13增强TextBox
 14增强TextBox'序号   版本    日期        说明
 15增强TextBox'1      0.1     2005-05-01  基本验证功能
 16增强TextBox'2      0.2     2005-05-05  增加边框颜色和常用验证功能
 17增强TextBox' ---------------------------------------------------------------------
 18增强TextBox#End Region
 19增强TextBox
 20增强TextBoxOption Strict On
 21增强TextBoxOption Explicit On 
 22增强TextBox
 23
 24增强TextBoxImports System
 25增强TextBoxImports System.Windows.Forms
 26增强TextBoxImports System.ComponentModel
 27增强TextBoxImports System.Drawing
 28增强TextBox#End Region
 29增强TextBox
 30 HD_TextBox
 31增强TextBox    Inherits System.Windows.Forms.TextBox
 32增强TextBox
 33
 34增强TextBox
 35 System.ComponentModel.IContainer)
 36增强TextBox        MyClass.New()
 37增强TextBox
 38增强TextBox        'Windows.Forms 类撰写设计器支持所必需的
 39增强TextBox        Container.Add(Me)
 40增强TextBox
 41增强TextBox        '初始化
 42增强TextBox        'Init()
 43增强TextBox        _bConstructed = True
 44增强TextBox
 45增强TextBox    End Sub
 46增强TextBox
 47()
 48增强TextBox        MyBase.New()
 49增强TextBox
 50增强TextBox        '该调用是组件设计器所必需的。
 51增强TextBox        InitializeComponent()
 52增强TextBox
 53增强TextBox        '在 InitializeComponent() 调用之后添加任何初始化
 54增强TextBox
 55增强TextBox    End Sub
 56增强TextBox
 57增强TextBox    '组件重写 dispose 以清理组件列表。
 58)
 59增强TextBox        If disposing Then
 60增强TextBox            If Not (components Is NothingThen
 61增强TextBox                components.Dispose()
 62增强TextBox            End If
 63增强TextBox        End If
 64增强TextBox        MyBase.Dispose(disposing)
 65增强TextBox    End Sub
 66增强TextBox
 67增强TextBox    '组件设计器所必需的
 68增强TextBox    Private components As System.ComponentModel.IContainer
 69增强TextBox
 70增强TextBox    '注意: 以下过程是组件设计器所必需的
 71增强TextBox    '可以使用组件设计器修改此过程。
 72增强TextBox    '不要使用代码编辑器修改它。
 73 InitializeComponent()
 74增强TextBox        components = New System.ComponentModel.Container
 75增强TextBox    End Sub
 76增强TextBox
 77增强TextBox#End Region
 78增强TextBox
 79
 80增强TextBox
 81增强TextBox    '是否允许空值
 82增强TextBox    Private _AllowNull As Boolean = True
 83增强TextBox
 84增强TextBox    '验证的正则表达式
 85增强TextBox    Private _Regex As String = ""
 86增强TextBox
 87增强TextBox    '非法提示信息
 88增强TextBox    Private _ErrorMsg As String = ""
 89增强TextBox
 90增强TextBox    '错误提示控件
 91增强TextBox    Private _ErrorProvider As ErrorProvider
 92增强TextBox
 93增强TextBox    '边框颜色
 94增强TextBox    Private _BoundColor As Color = Color.Transparent
 95增强TextBox
 96增强TextBox    '边框画笔
 97增强TextBox    Private pen_bound As Pen
 98增强TextBox
 99增强TextBox    '是否运行时实例化
100增强TextBox    Private _bConstructed As Boolean = False
101增强TextBox
102增强TextBox#End Region
103增强TextBox
104
105增强TextBox
106增强TextBox    <Description("扩展属性:是否允许空值."), Category("HD_TextBox")> _
107
108增强TextBox        Get
109增强TextBox            Return _AllowNull
110增强TextBox        End Get
111增强TextBox        Set(ByVal Value As Boolean)
112增强TextBox            _AllowNull = Value
113增强TextBox        End Set
114增强TextBox    End Property
115增强TextBox
116增强TextBox    <Description("扩展属性:验证文本的正则表达式."), Category("HD_TextBox")> _
117
118增强TextBox        Get
119增强TextBox            Return _Regex
120增强TextBox        End Get
121增强TextBox        Set(ByVal Value As String)
122增强TextBox            _Regex = Value
123增强TextBox        End Set
124增强TextBox    End Property
125增强TextBox
126增强TextBox    <Description("扩展属性:输入非法数据时的错误提示信息."), Category("HD_TextBox")> _
127
128增强TextBox        Get
129增强TextBox            Return _ErrorMsg
130增强TextBox        End Get
131增强TextBox        Set(ByVal Value As String)
132增强TextBox            _ErrorMsg = Value
133增强TextBox        End Set
134增强TextBox    End Property
135增强TextBox
136增强TextBox
137增强TextBox    <Description("扩展属性:边框颜色."), Category("HD_TextBox")> _
138 Color
139增强TextBox        Get
140增强TextBox            Return _BoundColor
141增强TextBox        End Get
142增强TextBox        Set(ByVal Value As Color)
143增强TextBox            _BoundColor = Value
144增强TextBox            pen_bound = New Pen(Value, 2)
145增强TextBox        End Set
146增强TextBox    End Property
147增强TextBox
148增强TextBox#End Region
149增强TextBox
150
151增强TextBox
152增强TextBox    Private _comRegex As CommanRegex = CommanRegex.Null
153增强TextBox
154增强TextBox    '内置正则表达式
155 CommanRegex
156增强TextBox        Null = 0
157增强TextBox        Email = 1
158增强TextBox        Telephone = 2
159增强TextBox        Mobile = 3
160增强TextBox    End Enum
161增强TextBox
162 CommanRegex
163增强TextBox        Get
164增强TextBox            Return _comRegex
165增强TextBox        End Get
166增强TextBox        Set(ByVal Value As CommanRegex)
167增强TextBox            _comRegex = Value
168增强TextBox        End Set
169增强TextBox    End Property
170增强TextBox
171增强TextBox    Private _Regexs() As String = { _
172增强TextBox        "", _
173增强TextBox        "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", _
174增强TextBox        "^(\(\d{3,5}\)|\d{3,5}-)?\d{6,8}$", _
175增强TextBox        "", _
176增强TextBox        "", _
177增强TextBox        "" _
178增强TextBox    }
179增强TextBox
180增强TextBox    Private _ErrorMsgs() As String = { _
181增强TextBox        "", _
182增强TextBox        "请输入合法的Email地址,例如: iHudan@GMail.com ", _
183增强TextBox        "请输入合法的电话号码,比如 021-12345678", _
184增强TextBox        "", _
185增强TextBox        "", _
186增强TextBox        "" _
187增强TextBox        }
188增强TextBox
189增强TextBox#End Region
190增强TextBox
191增强TextBox    '在控件验证事件中对文本框的内容进行验证
192.Validating
193增强TextBox
194增强TextBox        Dim result As Boolean
195增强TextBox        result = ValidateData()
196增强TextBox        ShowErr(result)
197增强TextBox        e.Cancel = result
198增强TextBox    End Sub
199增强TextBox
200增强TextBox    '对文本框的内容进行验证
201
202增强TextBox
203增强TextBox        Dim content As String = Me.Text
204增强TextBox        If content.Length = 0 Then
205增强TextBox            Return Not _AllowNull
206增强TextBox        Else
207增强TextBox            '不允许空值
208增强TextBox            Dim reg As System.Text.RegularExpressions.Regex
209增强TextBox            Dim tmpRegex As String
210增强TextBox            If _comRegex = CommanRegex.Null Then
211增强TextBox                tmpRegex = _Regex
212增强TextBox            Else
213增强TextBox                tmpRegex = Me._Regexs(_comRegex)
214增强TextBox            End If
215增强TextBox            If reg.IsMatch(content, tmpRegex) = True Then
216增强TextBox                Return False
217增强TextBox            Else
218增强TextBox                Return True
219增强TextBox            End If
220增强TextBox        End If
221增强TextBox    End Function
222增强TextBox
223增强TextBox    '显示错误提示
224增强TextBox    'bShow=true 显示错误提示
225增强TextBox    'bShow=false清楚错误提示
226)
227增强TextBox        If _ErrorProvider Is Nothing Then
228增强TextBox            _ErrorProvider = New ErrorProvider(CType(Me.TopLevelControl, ContainerControl))
229增强TextBox        End If
230增强TextBox        Dim errMsg As String
231增强TextBox        If bShow Then
232增强TextBox            '显示错误提示
233增强TextBox            If _comRegex = CommanRegex.Null Then
234增强TextBox                '用户自定义验证方式
235增强TextBox                errMsg = _ErrorMsg
236增强TextBox            Else
237增强TextBox                '系统内置验证方式
238增强TextBox                errMsg = Me._ErrorMsgs(Me._comRegex)
239增强TextBox            End If
240增强TextBox        Else
241增强TextBox            '清除错误提示
242增强TextBox            errMsg = ""
243增强TextBox        End If
244增强TextBox        _ErrorProvider.SetError(Me"")
245增强TextBox        _ErrorProvider.SetError(Me, errMsg)
246增强TextBox    End Sub
247增强TextBox
248增强TextBox    '在父窗体中绘画边框
249 System.Windows.Forms.PaintEventArgs)
250增强TextBox        Dim g As Graphics
251增强TextBox        g = e.Graphics
252增强TextBox
253增强TextBox        Dim r As Rectangle = Me.Bounds
254增强TextBox        g.DrawRectangle(pen_bound, r)
255增强TextBox    End Sub
256增强TextBox
257增强TextBox    '初始化数据
258 Init()
259增强TextBox        '初始化边框画笔
260增强TextBox        pen_bound = New Pen(_BoundColor, 2)
261增强TextBox
262增强TextBox        '添加父窗体的Paint事件 
263增强TextBox        If Me.BorderStyle = BorderStyle.None Then
264增强TextBox            AddHandler Me.Parent.Paint, AddressOf PaintBound
265增强TextBox        End If
266增强TextBox
267增强TextBox    End Sub
268增强TextBox
269增强TextBox    'TextBox被创建
270.HandleCreated
271增强TextBox        If _bConstructed = True Then
272增强TextBox            '运行时被创建
273增强TextBox            Init()
274增强TextBox        Else
275增强TextBox            '设计时被创建
276增强TextBox        End If
277增强TextBox    End Sub
278增强TextBox
279增强TextBoxEnd Class
280增强TextBox

调用方式:

 1.Load
 2增强TextBox        '设置边框样式
 3增强TextBox        Me.HD_TextBox1.BorderStyle = BorderStyle.None
 4增强TextBox        '设置边框颜色
 5增强TextBox        Me.HD_TextBox1.BoundColor = Color.Blue
 6增强TextBox        '设置内置验证方式(Email地址)
 7增强TextBox        Me.HD_TextBox1.ComRegex = HD_TextBox.HD_TextBox.CommanRegex.Email
 8增强TextBox
 9增强TextBox        '使用自定义验证方式
10增强TextBox        Me.HD_TextBox2.Regex = "^YS\d{6}$"
11增强TextBox        Me.HD_TextBox2.ErrorMsg = "请输入合法的编号,例如 YS100001"
12增强TextBox    End Sub


存在的一些问题:
1) 不知道TextBox有没有类似窗体的Form_Load事件,就是在运行时创建完TextBox之后触发的事件?
   我发现HandleCreated事件在窗体设计状态下,把TextBox加入到Form中的时候会被触发,如果直接在这里加入
   AddHandler Me.Parent.Paint, AddressOf PaintBound
    这样在设计界面中就无法正确显示TextBox控件,
   所以我加了一个_bConstructed变量标识是运行时还是设计时,如果是设计时就不调用.
  如果有只在运行时触发的事件(并且是在HandleCreated之后的事件),我就把初始化代码写在这里了.

2.当文本框输入的内容非法时,其它控件无法获得焦点,有些时候需要取消验证,比如点击"取消"或"退出"按钮的时候
  就不想再执行验证 否则非得输入一个合法得数据后才能取消太不爽了.


相关文章:

  • 2021-05-20
  • 2021-09-05
  • 2021-12-22
  • 2021-04-15
  • 2021-09-03
  • 2022-03-07
  • 2021-11-29
  • 2021-09-30
猜你喜欢
  • 2022-02-09
  • 2022-12-23
  • 2022-01-13
  • 2021-08-18
  • 2021-06-18
相关资源
相似解决方案