已经第二次机房收费系统重构了,一遍当然得有一遍的效果,正如对于文本框为空的提示方法,回顾第一遍机房,那些傻里傻气的If语句让自己对代码的亲和度大打折扣啊!那么到底有什么办法解决那些重复性的判断呢?这时候我们就要提到所谓的Model窗体了。在Model窗体中,建立一个封装数组,当窗体中需要判断大量文本框为空的时候,只需简单的调用即可。
新建一个Model类,来存放公共需要的部分。
1、定义一个结构体Term,且用结构体封装一个数组
Public Structure Term '定义结构体term
Dim controlSub As Control
Dim strText As String
Sub New(ByVal controlSub As Control, ByVal strText As String) '初始化对象
With Me
.controlSub = controlSub
.strText = strText
End With
End Sub
2、用结构体定义一个Term类型数组
'定义一个Term类型的结构体数组
Public arrayControl() As Term
3、判断文本框是否为空的函数
''' <summary>
''' 判断文本框是否为空,进而给出相应提示
''' </summary>
''' <param name="ArrayControl"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function CIsEmpty(ByVal ArrayControl() As Term) As Boolean
Dim termControl As Term '定义一个term类型变量
'遍历结构体数组中的所有元素,如果控件文本为空,则进行相应提示
For Each termControl In ArrayControl '遍历结构体数组中的所有元素
If TypeOf termControl.controlSub Is TextBox Then '判断控件是否为文本框
If termControl.controlSub.Text.Trim = "" Then '判断文本框内容是否为空
MessageBox.Show(termControl.strText & "不能为空!", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
termControl.controlSub.Focus() '获得焦点
Return True
Exit Function
End If
4、当然函数是写出来了,但是还得对定义的结构体进行初始化处理。我们需要在Registe的U层定义一个过程Rdim(),来完成此功能
Private Sub Rdim()
ReDim Preserve arrayControl(9) '重新声明数组维数
'初始化数组
arrayControl(0) = New Term(txtCard, "卡号")
arrayControl(2) = New Term(txtstudentNo, "学号")
arrayControl(3) = New Term(txtstudentName, "姓名")
arrayControl(4) = New Term(ComboSex, "性别")
arrayControl(5) = New Term(txtgrade, "年级")
arrayControl(6) = New Term(txtclass, "班级")
arrayControl(7) = New Term(txtCash, "金额")
arrayControl(8) = New Term(txtstatus, "注释")
End Sub
5、准备工作做完了,剩下的就是简单的调用了!在Register窗体中直接调用CIsEmpty函数即可。
Call Rdim() '首先调用Rdim过程进行数组初始化
'调用CIsEmoty()函数,检测是否输入文本框内容
If CIsEmpty(arrayControl) Then
Exit Sub
End If
这样当运行出现文本框为空的情况,系统则会自动提示,方便简洁!
6、那么如何能够实现一键清除操作呢?方法同判断文本框为空一样,只需要编写一个清除的函数则可
''' <summary>
''' 清楚文本框的数据
''' </summary>
''' <param name="arraycontrol"></param>
''' <returns>返回Boolean值,true</returns>
''' <remarks></remarks>
Public Function AllEmpty(ByVal arraycontrol() As Term) As Boolean
Dim termControl As Term '定义一个term类型变量
For Each termControl In arraycontrol
If TypeOf termControl.controlSub Is TextBox Then
termControl.controlSub.Text = "" '判断控件类型,如果是文本框或组合框则内容清空
End If
Next
Return True
End Function
7、然后调用:
Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
Call Rdim() '首先调用Rdim过程进行数组初始化
'调用AllEmoty()函数,删除文本框中内容
If AllEmpty(arrayControl) Then
Exit Sub
End If
End Sub
上述虽然只是在注册窗体中描述,但是对于其他的文本框以及组合框都是使用的,只要在对应的窗体中对结构体进行初始化处理,然后直接调用则可。
感受:
机房收费依旧在一步一步的进行着,与以往不同的则是所谓的“感觉”已经成熟了,最起码当遇到问题的时候自己会想尽办法去寻找最简单实用的方法来满足其需求。