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

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

我们知道在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控件其实是不必判断为空的,从全心全意为人民服务的角度出发,应该在窗体登陆时就在这些控件中填充上常用的数据。

总结:

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

时间: 2024-12-26 05:17:16

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

DateTimePicker 控件置空

dtOrderDateFrom.Format = DateTimePickerFormat.Custom; dtOrderDateFrom.CustomFormat = " "; DateTimePicker 时间控件置空

easyui时间控件设置为可清空——jquery-easyui-1.3.3(这个版本还没有buttons,网上的好多博文都是1.3.5之后的版本)

效果图: 更改的源码jquery.easyui.min.js 11358行: var _858=$("<div class=\"datebox-button\"></div>").appendTo(_856); $("<a href=\"javascript:void(0)\" class=\"datebox-current\"></a>").html(opt

C# DataGridView控件绑定数据后清空数据

在清除DataGridview的数据时: 1.DataSource为NULL(DataGridView.DataSource= null;)这样会将DataGridView的列也删掉. 2.用DataGridview.Rows.Clear();  提示"不能清除此列表"!!!!! 以上都不是想要的结果.想要满足保持原有的列,就是重新绑定之前的DataTable,然后清除DataTable中的数据,如下: DataTable  dt  =  (DataTable)dataGridView

【机房收费系统】抽象

是否为空?一开始我是用的isnull 来逐个判断的,但是重复的地方的确很多.我们秉着一个重复就要努力抽象的原则,同时争取相似的功能用不同的实现方式.今天算是做个小结,抛砖引玉,希望大家多多的提宝贵意见. 抽象,是为了实现更好的代码复用,也便于日后的维护.希望在做合作版的时候,能对这些问题有一个更加深刻的理解. 判断用户名是否存在 这可以单独写一个方法或是小类. 判断是否为空 以下是参照高晓青师傅的博客写的. ''' <summary> ''' 判断窗体上所有控件是否为空 ''' </su

[转] 基于C#的波形显示控件的实现

转自 基于C#的波形显示控件的实现[附完整源码下载] 编者记: 09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的数据进行处理和保存,并以图形的方式显示),整个项目边学C# WinForm边设计,这个波形显示控件就是项目中的一部分,也花了自己绝大多数时间.此外,顺便将该波形显示控件当作自己毕业设计的内容,下文实际上是节选自自己的本科毕业论文,希望对大家能有所帮助.代码以及文章有疏漏.错误.不妥之处在所难免,欢迎

基础控件二

验证控件: RequiredFieldValidator控件   非空验证 功能说明:验证控件必须输入,未输入时或输入与初始值相同时提示错误信息 命名前缀:ReqVdt ASPX代码:<asp:RequiredFieldValidator ID="ReqVdtName" runat="server" ErrorMessage="未输入姓名" ControlToValidate="TxtSample"> </a

如何清空文件上传控件里的选定文件(路径)

我又来扯鸡毛蒜皮了.有名言曰人生短得不够扯鸡毛蒜皮,但我的工作就是由无数的鸡毛蒜皮组成,如之奈何? 今天的鸡毛和蒜皮是:如何清空文件上传控件里的选定文件(路径)? 场景是酱紫的: 有一个上传控件和一个按钮,其中上传控件隐藏.点击按钮,触发上传控件点击事件,于是弹出文件选择对话框:选好文件后,于是触发了上传控件的onchange事件.在这个事件里,将文件上传. 有点装逼,就是隐藏了上传控件.这可能是出于界面简约的考虑.问题是,同一个文件不能连续上传2次,因为路径不变,没有触发onchange事件.

webForm中的验证控件

1.非空验证控件:RequireFieldValidator  :2.数据比较验证:CompareValidator :3.数据范围验证:RangeValidator :4.正则表达式验证:RegularExpressionValidator :5.自定义条件验证: CustomValidator 非空验证控件:RequireFieldValidator 当某个接受用户输入的控件中的内容,不能为空时,使用RequiredFildValidator控件, 必须设置以下两个属性: ErrorMess

ASP.NET中的验证控件

ASP.NET提供了如下的控件: RequiredFieldValidator: 字段必填 (ControlTovalidate设定要验证的控件) RangeValidator: 值在给定的最大值,最小值之间() CompareValidator: 用于比较两个值的关系是否满足要求或者是否是指定类型的数据 RegularExpressionValidator: 校验数据满足正则表达式 CustomValidator: 自定义验证 Validator验证控件的共性 IsValid属性,用来判断页面