当我们在每个窗体上每次都得判断每个控件是否为空的时候,是不是很抓狂?判断完一个就是下一个接着另一个,看着那一长串if...else让人眼晕!其实,在面向对象的范畴里,对于相同的或者类似的代码只要重复3次以上我们应该想到面向对象的三大特性之一:封装。
我们常用的输入数据的控件一般为TextBox和CmoboBox,在此我就以它们为例(需要用到控件的TabIndex属性和Tag属性,而Text属性代替Tag属性的话出现不了运行效果):
这个例子也不是一蹴而就的,大体经过三次转变:
第一次: 代码比较长,而且遍历是从控件的TabIndex属性由大到小进行的,运行结果不如人意~
Public Shared Function IsEmptyText(ByVal Objs As Windows.Forms.Control.ControlCollection) As Boolean '声明一个Control类的实例 Dim objCon As Control '开始遍历Control类中的每一个控件 For Each objCon In Objs 'TypeOf 判断类型 If TypeOf (objCon) Is TextBox Then If objCon.Text = "" Then MsgBox(objCon.Tag.ToString + "不能为空", vbOKOnly + vbExclamation, "警告") objCon.Focus() Return False Exit Function End If '利用TypeOf查看控件的类型 ElseIf TypeOf (objCon) Is ComboBox Then If objCon.Text = "" Then MsgBox(objCon.Tag.ToString + "不能为空", vbOKOnly + vbExclamation, "警告") objCon.Focus() Return False Exit Function End If End If Next Return True End Function
第二次: 整合了第一次的分别判断
Public Shared Function IsEmptyText(ByVal Objs As Form) As Boolean For Each objCon As Control In Objs.Controls If (TypeOf objCon Is TextBox) Or (TypeOf objCon Is ComboBox) Then If objCon.Text.Trim = "" Then MsgBox(objCon.Tag + "不能为空!", vbOKOnly + vbInformation, "系统提示") objCon.Focus() Return False Exit For Else Return True End If End If Next End Function
第三次:优化第二次,解决了遍历的问题
Public Shared Function IsEmptyText(ByVal Objs As Form) As Boolean For i As Integer = Objs.Controls.Count - 1 To 0 Step -1 If (TypeOf Objs.Controls(i) Is TextBox) Or (TypeOf Objs.Controls(i) Is ComboBox) Then If Objs.Controls(i).Text.Trim = "" Then MsgBox(Objs.Controls(i).Tag + "不能为空!", vbOKOnly + vbInformation, "系统提示") Objs.Controls(i).Focus() Return False Exit For End If End If Next End Function
'调用IsEmptyText()函数,验证窗体的控件是否为空 Dim strIsEmpty strIsEmpty = IsEmpty.IsEmptyText(Me) If strIsEmpty = True Then Exit Sub End If
也许,代码还不完美,甚至即使有现成的也看不懂(重量级地查询控件-sp1234)。但在学习的过程中首先得有这种意识,并尝试去做,而不论是从别人那里吸取过来还是自己研究出来,然后慢慢的在以后的学习中对以前的知识会有更高、更深刻、更全面的认识。