机房重构--模板方法

  模板方法自己摸索了很久,还很傻的把一个使用的窗体当做父窗体给继承了,所以大家一定要把组合查询相似的东西抽象出来写一个父窗,父窗体就是所以子窗体的都有的功能空白的没有赋值的窗体。

  父窗体
这里写图片描述
  UI层父窗体中的部分代码

    ''实例化组合查询的实体

    Protected GroupInquiryInfo As New Entity.LineStateEntity
    ''' <summary>
    ''' 查询
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnCheck_Click(sender As Object, e As EventArgs) Handles btnCheck.Click
        GroupInquiryInfo.TableName = GetTable()       '调用GetTable方法获得要查询表中     
        GroupInquiryInfo.ComboName1 = ChangeEnglish(ComboName1.Text) '调用ChangeEnglish哈希表方法
        GroupInquiryInfo.ComboName2 = ChangeEnglish(ComboName2.Text)
        GroupInquiryInfo.ComboName3 = ChangeEnglish(ComboName3.Text)

        GroupInquiryInfo.ComboOpsina1 = ComboOpsina1.Text
        GroupInquiryInfo.ComboOpsina2 = ComboOpsina2.Text
        GroupInquiryInfo.ComboOpsina3 = ComboOpsina3.Text

        GroupInquiryInfo.ComboContent1 = ComboContent1.Text
        GroupInquiryInfo.ComboContent2 = ComboContent2.Text
        GroupInquiryInfo.ComboContent3 = ComboContent3.Text

        GroupInquiryInfo.ComboRelation1 = ChangeEnglish(ComboRelation1.Text)
        GroupInquiryInfo.ComboRelation2 = ChangeEnglish(ComboRelation2.Text)
        '查询上机记录      GetLineState   实体GroupInquiryInfo
        Dim table As New DataTable   
        Dim FacadeGroupChack As New Facade.GroupChackFacade()
        table = FacadeGroupChack.CallGroupChack(GroupInquiryInfo)
        If table.Rows.Count < 0 Then
            Msgbox("没有记录")         ''没有记录
        Else
            Call Todgv(table)         '调用显示数据的方法
            'dgvPrint.DataSource = table  '直接显示查询到的内容
        End If

    ''' <summary>
    ''' 中文转换成英文
    ''' </summary>
    ''' <param name="comboName"></param>
    ''' <returns></returns>
    Public Overridable Function ChangeEnglish(comboName As String) As String
        Return ""
    End Function

    ''' <summary>
    ''' 定义虚函数GetTable,获取不同数据库的表名  
    ''' </summary>
    ''' <returns></returns>
    Public Overridable Function GetTable() As String
        Return ""
    End Function
    ''' <summary>
    ''' 重载得到表列名
    ''' </summary>
    ''' <param name="control"></param>
    ''' <returns></returns>
    Public Overridable Function GetDBName(ByVal control As String) As String
        Return ""
    End Function
    ''' <summary>
    ''' 根据输入信息的不同改变出现 运算符号 和控件
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub ComboName1_TextChanged(sender As Object, e As EventArgs) Handles ComboName1.TextChanged
        Select Case ComboName1.SelectedItem    '选中的字段名表示
            Case "卡号", "身份号", "姓名", "性别", "系别", "级别", "机器名"
                ComboOpsina1.Items.Clear()
                ComboOpsina1.Items.Add("=")
                ComboOpsina1.Items.Add("<>")
            Case "学号""上机时间", "下机时间", "消费金额", "消费时间", "注册时间"
                ComboOpsina1.Items.Clear()
                Dim FieldOpsina() As String
                FieldOpsina = {">", "<", "=", "<>"}
                ComboOpsina1.Items.AddRange(FieldOpsina)
        End Select
        If ComboName1.Text = "上机时间" Or ComboName1.Text = "下机时间" Or ComboName1.Text = "注册时间" Then
            dtpContent1.Visible = True
            dtpContent1.Enabled = True
            ComboContent1.Visible = False
            ComboContent1.Enabled = False
        Else
            dtpContent1.Visible = False
            dtpContent1.Enabled = False
            ComboContent1.Visible = True
            ComboContent1.Enabled = True
        End If
    End Sub

    ''' <summary>
    ''' 清空comboBox控件中的值
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btuClear_Click(sender As Object, e As EventArgs) Handles btuClear.Click
        For Each ctr1 In gbContent.Controls          'gbconutent框中的控件
            If TypeOf ctr1 Is ComboBox Then           'Combox 类型的控件
                ctr1.SelectedIndex = -1               '控件的这个属性为-1时,控件显示空
            End If
        Next

        For Each ctr2 In gbRelation.Controls     'gbRelation框中的控件
            If TypeOf ctr2 Is ComboBox Then      'Combox 类型的控件
                ctr2.SelectedIndex = -1
            End If
        Next       
    End Sub

  子窗体
  操作如下:项目–添加Windows窗体–选择Windows Forms–选择继承的窗体–选择你要继承的父窗体–确认

  子窗体代码

    ''' <summary>
    ''' 控件中添加字段
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub frmSeekModUser_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '字段内容添加  用户字段
        Dim FieldName() As String
        FieldName = {"身份号", "姓名", "学号", "性别", "系别", "班级", "注册时间"}
        ComboName1.Items.AddRange(FieldName)
        ComboName2.Items.AddRange(FieldName)
        ComboName3.Items.AddRange(FieldName)
    End Sub
    ''' <summary>
    ''' 重写转换成数据库字段的方法
    ''' </summary>
    ''' <param name="control"></param>
    ''' <returns></returns>
    Public Overrides Function ChangeEnglish(control As String) As String   '如果重写方法需要Overrides   可用重写时用
        Dim FieldName() As String
        Dim GetDBName() As String
        FieldName = {"身份号", "姓名", "学号", "性别", "系别", "班级", "注册时间", "或", "与"}
        GetDBName = {"UserID", "UserName", "UserNo", "Sex", "Department", "Grade", "RegisterTime", "or", "and"}
        Dim ht As Hashtable = New Hashtable()
        For i = 0 To FieldName.Count - 1 '给哈希表赋值 键值都是字符类型  不能是集合
            ht.Add(FieldName(i), GetDBName(i)) 'ht是哈希表
        Next i
        ChangeEnglish = ht.Item(control)
    End Function
    ''' <summary>
    ''' 重写获得数据库表名
    ''' </summary>
    ''' <returns></returns>
    Public Overrides Function GetTable() As String
        Return "User_Info"
    End Function
    ''' <summary>
    '''显示查询出表中的信息
    ''' </summary>
    ''' <param name="table"></param>
    Protected Overrides Sub Todgv(ByVal table As DataTable)
        If table.Rows.Count = 0 Then  
            dgvPrint.DataSource = Nothing
            dgvPrint.ClearSelection()
            dgvPrint.Refresh()
        Else
            'dgvPrint.AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.Fill '表格自适应宽度
            'dgvPrint.AutoGenerateColumns = True  ’自动添加行
            For X = 0 To 6              '添加六列使用一个循环每次添加一个
                dgvPrint.Columns.Add("x", "on")
            Next
            For i = 0 To table.Rows.Count - 1
                dgvPrint.Rows.Add()   '添加行
                For j = 0 To 6
                    dgvPrint.Rows(i).Cells(j).Value = table.Rows(i).Item(j)
                Next
            Next
            ''添加表头信息
            dgvPrint.Columns(0).HeaderText = "卡号"
            dgvPrint.Columns(1).HeaderText = "姓名"
            dgvPrint.Columns(2).HeaderText = "学号"
            dgvPrint.Columns(3).HeaderText = "性别"
            dgvPrint.Columns(4).HeaderText = "系别"
            dgvPrint.Columns(5).HeaderText = "班级"
            dgvPrint.Columns(6).HeaderText = "注册时间"
            '删除组后空白行
            dgvPrint.AllowUserToAddRows = False
        End If
    End Sub

  模板方法就是复用,从父窗体继承来的都不能更改,但是可以重载。这样就能减少重复的工作了。

猜你喜欢

转载自blog.csdn.net/m18330808841/article/details/80529960