码迷,mamicode.com
首页 > 其他好文 > 详细

机房收费--模块应用:控件为空、全部清空、是否为数字

时间:2015-02-26 10:08:06      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:遍历   实例   控件   

           机房收费进行有一段时日了,今天对注册窗体的大量文本框和下拉列表进行操作时引发思考:指定文本框判断是否为空、是否为数字、清空文本框的代码都是大同小异的,依据相同归一原则,是否能将它们放到一个类中?


我们知道在vb中用到传统的方法是:把文本框粘贴复制成为数组,通过循环的方式遍历每一个文本框判定是否为空;要使弹出框提示内容与文本框相对应(如,“txtCardID”为空,则提示“卡号不能为空”),可以通过定义转换函数的方法来实现。

        它存在的缺点是:控件数组的命名将不能直观体现文本框含义,我们必须将数组元素与文本框的真实含义相对应,否则就会出错。例如:txtbox(0)对应 “卡号”,如果错认为对应“学号“,提示内容将出现混乱。

        vb.net取消了控件数组的方法,我们再次粘贴复制的时候形成的是单个控件而不能形成数组。这时,我们必须另寻它法。通过查阅博客,找到了两个比较好的方法,与大家共勉:一个是王海涛师哥写的《VB.NET 完美解决判断文本框、组合框为空问题》;一个是霍亚静师姐《vb.net & 文本框为空提示,一键清空文本框所有内容》


        师哥用的是封装类的方法,通过定义控件基类,将控件封装进数组遍历来判断是否为空:

Public Shared Function IsAllEmptyText(ByVal frm As Form) As Boolean  
    Dim control As New Control  
  
    For Each control In frm.Controls '遍历窗体中所有的控件  
        If TypeOf control Is TextBox Then '判断控件是不是文本框  
            If control.Text.Trim = "" Then '判断文本框内容是否为空  
                MsgBox(control.Tag.ToString + "不能为空!", vbOKOnly, "温馨提示")  
                control.Focus()  
                Return True  
                Exit Function  
            End If  
        ElseIf TypeOf control Is ComboBox Then '判断控件是不是组合框  
            If control.Text.Trim = "" Then  
                MsgBox(control.Tag.ToString + "不能为空!", vbOKOnly, "温馨提示")  
                Return True  
                Exit Function  
            End If  
        End If  
    Next  
  
    Return False  
End Function 
        

        所不同的是师姐采用结构体的思想,将所要提示的文字信息和控件封装进结构体(在U层建立模块窗体):

    Public Structure term    '定义结构体
        Dim controlSub As Control  '控件类型基类来储存控件
        Dim strText As String   '储存文字

        Sub New(ByVal controlSub As Control, ByVal strText As String)  'new方法来实例化控件
            With Me
                .controlSub = controlSub
                .strText = strText
            End With
        End Sub
    End Structure

       说到结构体,我是比较陌生的,可以将其理解为功能更为强大的数据类型。一个复杂的事物往往由一个变量来描述是不行的,需要许多不同类型的变量共同描述,就像“时钟”可以由“时、分、秒”共同描述一样;上例中的term结构体由控件control和字符string共同描述,可以用来存储多种类型的数据。

      

        第二步,定义存储结构体的数组,用于存放所要判断的控件信息:

Public arrayControl() As term   '存放结构体的数组

        第三步,定义要实现的函数,可以将对文本框的常用判断都封装成函数,这里封装了是否为空,全部清空和是否为数字的判断方法:

  Public arrayControl() As term   '存放结构体的数组

    '判断是否为空函数
    Public Function CIsEmpty(ByVal ArrayControl() As term) As Boolean
        Dim termControl As New term   '实例化数组元素

        For Each termControl In ArrayControl   '每一个结构体数组中的元素
            '结构体的控件是文本框或者下拉列表框时,判断是否为空
            If (TypeOf termControl.controlSub Is TextBox) Or (TypeOf termControl.controlSub Is ComboBox) Then
                If termControl.controlSub.Text.Trim = "" Then  '为空时提示不能为空,并获得焦点,返回true
                    MessageBox.Show(termControl.strText & "不能为空!!!", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    termControl.controlSub.Focus()
                    Return True
                    Exit Function
                End If
            End If
        Next

        Return False  '返回false,表示没有为空的文本框
    End Function

    '将指定的文本框清空
    Public Function AllEmpty(ByVal Arraycontrol() As term) As Boolean
        Dim termControl As New term

        For Each termControl In Arraycontrol
            If TypeOf termControl.controlSub Is TextBox Then
                termControl.controlSub.Text = ""
            End If
        Next
        Return True
    End Function

    '判断指定的文本框是否为数字
    Public Function IsNum(ByVal Arraycontrol() As term) As Boolean
        Dim termControl As New term

        For Each termControl In Arraycontrol
            If TypeOf termControl.controlSub Is TextBox Then
                If IsNumeric(termControl.controlSub.Text.Trim) = False Then
                    MessageBox.Show(termControl.strText & "必须为数字!!!", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    termControl.controlSub.Text = ""
                    termControl.controlSub.Focus()
                    Return True
                    Exit Function
                End If
            End If
        Next
        Return False
    End Function

      实现方法:在U层用sub方法收集结构体数组,使用时直接用Call调用

    Private Sub Rdim()
        ReDim Preserve arrayControl(7)
        arrayControl(0) = New term(txtCardID, "卡号")
        arrayControl(1) = New term(txtStuID, "学号")
        arrayControl(2) = New term(txtName, "姓名")
        arrayControl(3) = New term(txtSeriers, "系别")
        arrayControl(4) = New term(txtGrade, "年级")
        arrayControl(5) = New term(txtClass, "班级")
        arrayControl(6) = New term(txtDescribe, "描述")
    End Sub

    Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
        '清空指定控件内容
        Call Rdim()
        If AllEmpty(arrayControl) Then
            Exit Sub
        End If

    End Sub
       

         结构体建立和函数的封装都是建立在U层的模块当中,其实跟我们敲击vb版机房收费系统模块是相同的,里面存储一些U层显示内容使用的静态方法,对比类而言,无法实现继承,无法实现接口。详细内容推荐一篇博文《VB.NET模块与众不同之处》

        任何方法都要考虑他的利弊,它对于控件较为繁杂的窗体是非常适用的,但如果一个窗体中只有两个文本框就大可不必使用如此繁琐的方式了,盲目的使用只会增加计算机的负担。诸如判断文本框内容是否为数字,使用IsNumeric方法就可以搞定,只有当判断的文本框比较多时才考虑将控件封装到结构体数组中。另外combox控件其实是不必判断为空的,从全心全意为人民服务的角度出发,应该在窗体登陆时就在这些控件中填充上常用的数据。

 

 总结:

        任何时候都应该使用批判的眼光去吸收所运用的知识,只有这样才能慢慢摸索门道,一种方法什么时候该用,什么时候好用!

        


机房收费--模块应用:控件为空、全部清空、是否为数字

标签:遍历   实例   控件   

原文地址:http://blog.csdn.net/whp15369657805/article/details/43938591

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!