模板方法自己摸索了很久,还很傻的把一个使用的窗体当做父窗体给继承了,所以大家一定要把组合查询相似的东西抽象出来写一个父窗,父窗体就是所以子窗体的都有的功能空白的没有赋值的窗体。
父窗体
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
模板方法就是复用,从父窗体继承来的都不能更改,但是可以重载。这样就能减少重复的工作了。