使用场景
组合查询在软件系统应用很广泛。当我们在漫步在淘宝街上的时候,是曾想过我们如何才能准确的找到自己想要的东西呢?----------组合查询来帮忙
在机房收费系统中,组合查询的应用是在操作员的功能下,其主要目的就是便于我们查找一些满足不同条件下的结果,但是当这三个功能基本上相同的,那么大量的代码重复必然不是好事,这里就引入了模板方法。
模板方法:定义了一个操作中的算法的骨架,把一些步骤延迟到子类当中。它使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。它提供了一个代码复用的平台,消除代码冗余带来的弊端,使系统更易于维护。
操作步骤:
1、建立模板父窗体
代码如下
<strong>Imports LoginEntity
Imports Facade
Public Class frmGroupQuery
Protected enGroupQuery As New GroupeQueryEntity
Private Sub frmGroupQuery_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'将参数传递给实体,赋初值
'因为不同窗体字段不同,所以赋"",子窗体重写它
enGroupQuery.cboName1 = ""
enGroupQuery.cboName2 = ""
enGroupQuery.cboName3 = ""
'操作符
cboMark1.Items.Add(">")
cboMark1.Items.Add("<")
cboMark1.Items.Add("=")
cboMark1.Items.Add("<>")
cboMark2.Items.Add(">")
cboMark2.Items.Add("<")
cboMark2.Items.Add("=")
cboMark2.Items.Add("<>")
cboMark3.Items.Add(">")
cboMark3.Items.Add("<")
cboMark3.Items.Add("=")
cboMark3.Items.Add("<>")
'关系
cboRelation1.Items.Add("与")
cboRelation1.Items.Add("或")
cboRelation2.Items.Add("与")
cboRelation2.Items.Add("或")
'窗体加载后,后两组控件默认不可用
cboName2.Enabled = False
cboName3.Enabled = False
cboMark2.Enabled = False
cboMark3.Enabled = False
cboRelation2.Enabled = False
txtContent2.Enabled = False
txtContent3.Enabled = False
'设置选中单元格就选中行
dgvRecord.SelectionMode = DataGridViewSelectionMode.FullRowSelect
Dim i As Integer
For i = 0 To dgvRecord.Columns.Count - 1
dgvRecord.Columns(i).Width = DataGridViewAutoSizeColumnsMode.AllCells
Next
End Sub
Private Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.Click
If cboRelation1.Text = "" Then
If cboName1.Text = "" Or cboMark1.Text = "" Or txtContent1.Text = "" Then
MsgBox("第一行查询条件不能为空,请完善查询信息!", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
Exit Sub
End If
End If
If cboRelation1.Text <> "" Then
If cboName1.Text = "" Or cboMark1.Text = "" Or txtContent1.Text = "" Or
cboName2.Text = "" Or cboMark2.Text = "" Or txtContent2.Text = "" Then
MsgBox("第二行查询条件不能为空,请完善查询信息!", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
Exit Sub
End If
Else
If cboRelation2.Text <> "" Then
If cboName1.Text = "" Or cboMark1.Text = "" Or txtContent1.Text = "" Or
cboName2.Text = "" Or cboMark2.Text = "" Or txtContent2.Text = "" Or
cboName3.Text = "" Or cboMark3.Text = "" Or txtContent3.Text = "" Then
MsgBox("第三行查询条件不能为空,请完善查询信息!", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
Exit Sub
End If
End If
End If
'将参数传给实体
enGroupQuery.dbName = GetdbName()
enGroupQuery.cboName1 = ToEnglish(cboName1.Text)
enGroupQuery.cboName2 = ToEnglish(cboName2.Text)
enGroupQuery.cboName3 = ToEnglish(cboName3.Text)
enGroupQuery.cboMark1 = cboMark1.Text.Trim
enGroupQuery.cboMark2 = cboMark2.Text.Trim
enGroupQuery.cboMark3 = cboMark3.Text.Trim
enGroupQuery.txtContent1 = txtContent1.Text.Trim
enGroupQuery.txtContent2 = txtContent2.Text.Trim
enGroupQuery.txtContent3 = txtContent3.Text.Trim
''前者还是后者
enGroupQuery.cboRelation1 = ToEnglish(cboRelation1.Text)
enGroupQuery.cboRelation2 = ToEnglish(cboRelation2.Text)
Dim GroupQueryFacade As New GroupQueryFacade '实例化外观层
Dim dt As New DataTable
dt = GroupQueryFacade.GroupCheck(enGroupQuery)
If dt Is Nothing Then
MsgBox("该条件下没有记录")
Else
Call Todgv()
End If
End Sub
Public Overridable Function ToEnglish(cboName As String) As String
Return ""
End Function
''' <summary>
''' 获得数据库表名
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Protected Overridable Function GetdbName() As String
Return ""
End Function
''' <summary>
''' 把表显示到datagridview中
''' </summary>
''' <remarks></remarks>
Protected Overridable Sub Todgv()
End Sub
Public Function Query(frm As frmGroupQuery) As String
Dim cmdText As String = "" & frm.ToEnglish(frm.cboName1.Text) & frm.cboMark1.Text & "'" & frm.txtContent1.Text & "'"
'非组合查询
If frm.cboRelation1.Text = "" Then
cmdText = cmdText
Else
'关系1为空,关系2不为空
If frm.cboRelation1.Text <> "" Then
cmdText = cmdText & frm.ToEnglish(frm.cboRelation1.Text) & "" &
frm.ToEnglish(frm.cboName2.Text) & frm.cboMark2.Text & "'" & frm.txtContent2.Text & "'"
Else
'关系1、2 都不为空
cmdText = cmdText & frm.ToEnglish(frm.cboRelation1.Text) & "" &
frm.ToEnglish(frm.cboName2.Text) & frm.cboMark2.Text & "'" & frm.txtContent2.Text & "'" & "" &
frm.ToEnglish(frm.cboRelation2.Text) & "" &
frm.ToEnglish(frm.cboName3.Text) & frm.cboMark3.Text & "'" & frm.txtContent2.Text & "'"
End If
End If
Return cmdText
End Function
''' <summary>
''' 第一个组合关系不为空
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Sub cboRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation1.SelectedIndexChanged
If cboRelation1.Text = "" Then
cboName2.Enabled = False
cboName3.Enabled = False
cboMark2.Enabled = False
cboMark3.Enabled = False
cboRelation2.Enabled = False
txtContent2.Enabled = False
txtContent3.Enabled = False
Else
cboName2.Enabled = True
cboMark2.Enabled = True
cboRelation2.Enabled = True
txtContent2.Enabled = True
End If
End Sub
''' <summary>
''' 第二个组合关系不为空
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Sub cboRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation2.SelectedIndexChanged
If cboRelation2.Text = "" Then
cboName3.Enabled = False
cboMark3.Enabled = False
txtContent3.Enabled = False
Else
cboName3.Enabled = True
cboMark3.Enabled = True
txtContent3.Enabled = True
End If
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Me.Close()
End Sub
End Class</strong>
2、建立子窗体
单机添加
选择自己需要继承的父窗体
3、以学生上机统计信息查询为例
代码如下
<strong>Imports LoginEntity
Imports LoginBLL
Imports Facade
Public Class FrmOperateStatistics
Private Sub frmOperateStatistics_Load(sender As Object, e As EventArgs) Handles MyBase.Load
cboName1.Items.Add("序列号")
cboName1.Items.Add("卡号")
cboName1.Items.Add("姓名")
cboName1.Items.Add("上机日期时间")
cboName1.Items.Add("下机日期时间")
cboName1.Items.Add("消费时间")
cboName1.Items.Add("消费金额")
cboName1.Items.Add("机器号")
cboName1.Items.Add("状态")
cboName2.Items.Add("序列号")
cboName2.Items.Add("卡号")
cboName2.Items.Add("姓名")
cboName2.Items.Add("上机日期时间")
cboName2.Items.Add("下机日期时间")
cboName2.Items.Add("消费时间")
cboName2.Items.Add("消费金额")
cboName2.Items.Add("机器号")
cboName2.Items.Add("状态")
cboName3.Items.Add("序列号")
cboName3.Items.Add("卡号")
cboName3.Items.Add("姓名")
cboName3.Items.Add("上机日期时间")
cboName3.Items.Add("下机日期时间")
cboName3.Items.Add("消费时间")
cboName3.Items.Add("消费金额")
cboName3.Items.Add("机器号")
cboName3.Items.Add("状态")
End Sub
''' <summary>
''' 把加载的汉字转换成数据库的字段
''' </summary>
''' <param name="cboName"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Overrides Function ToEnglish(cboName As String) As String
Select Case cboName
Case "序列号"
ToEnglish = "series"
Case "卡号"
ToEnglish = "cardno"
Case "上机日期时间"
ToEnglish = "OnlineDateTime"
Case "下机日期时间"
ToEnglish = "OutlineDateTime"
Case "消费时间"
ToEnglish = "ConsumeTime"
Case "消费金额"
ToEnglish = "ConsumeCash"
Case "机器号"
ToEnglish = "Computer"
Case "状态"
ToEnglish = "status"
Case "与"
ToEnglish = "and"
Case "或"
ToEnglish = "or"
Case Else
ToEnglish = ""
End Select
End Function
''' <summary>
''' 传数据库表名
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Protected Overrides Function GetdbName() As String
Return "T_line" '组合查询的视图(卡表+学生表)
End Function
''' <summary>
''' 把数据显示到datagridview中
''' </summary>
''' <remarks></remarks>
Protected Overrides Sub Todgv()
Dim dt As New DataTable
Dim frmGropQuery As New frmGroupQuery
Dim GroupQueryFacade As New GroupQueryFacade
Try
dt = GroupQueryFacade.GroupCheck(enGroupQuery)
If dt.Rows.Count = 0 Then
dt.Clear()
dgvRecord.DataSource = Nothing
dgvRecord.Refresh()
Else
dgvRecord.DataSource = dt
dgvRecord.Columns(0).Visible = False
dgvRecord.Columns(0).HeaderText = "序列号"
dgvRecord.Columns(1).HeaderText = "卡号"
dgvRecord.Columns(2).HeaderText = "上机日期时间"
dgvRecord.Columns(3).HeaderText = "下机日期时间"
dgvRecord.Columns(4).HeaderText = "消费时间"
dgvRecord.Columns(5).HeaderText = "消费金额"
dgvRecord.Columns(6).HeaderText = "机器号"
dgvRecord.Columns(7).HeaderText = "状态"
End If
Catch ex As Exception
MsgBox(ex.Message, vbOKOnly, "提示")
End Try
End Sub
End Class
</strong>
其余的窗体也是这个步骤,模板方法减少了大量代码量,提高了效率。