.NET重构(四):窗体继承+模板方法,完美实现组合查询
導(dǎo)讀:在機(jī)房重構(gòu)中,有好些個(gè)查詢都是大同小異,最為顯著的就是組合查詢了。怎樣給自己省事兒,相同的東西能不能重復(fù)利用,就成了一個(gè)現(xiàn)實(shí)的問題。第一遍做機(jī)房的時(shí)候,使用的更多的是:復(fù)制+粘貼。學(xué)習(xí)了設(shè)計(jì)模式后,可以用模板方法解決。這篇文章,就通過窗體繼承和模板方法,實(shí)現(xiàn)組合查詢。
觀點(diǎn):組合查詢?cè)跈C(jī)房中有3中情況,其實(shí),組合查詢完全可以看到是一種查詢情況。
一、窗體繼承的使用
1,首先建立一個(gè)父窗體
2,添加一個(gè)新項(xiàng)
3,選擇繼承窗體
4,確定后,一個(gè)新的繼承窗體就好了。
二、模板方法的使用
備注:定義一個(gè)組合查詢的實(shí)體,方便傳參
1,首先在U層寫入基礎(chǔ)方法和傳參
<span style="font-size:18px;">Public Class FrmGroupQueryPublic enGroupQuery As New Model.GroupQueryM '定義一個(gè)實(shí)體參數(shù)Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles btnQuery.Click'第一行組合關(guān)系為空If cmbRelation1.Text = "" Then'判斷第一行控件內(nèi)容是否為空If cmbField1.Text = "" ThenMsgBox("請(qǐng)輸入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("請(qǐng)輸入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("請(qǐng)輸入要查詢的內(nèi)容")End IfEnd If' 當(dāng)?shù)谝粋€(gè)組合關(guān)系不為空時(shí) If cmbRelation1.Text <> "" ThenIf cmbField1.Text = "" ThenMsgBox("請(qǐng)輸入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("請(qǐng)輸入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("請(qǐng)輸入要查詢的內(nèi)容")ElseIf cmbField2.Text = "" ThenMsgBox("請(qǐng)輸入字段名")ElseIf cmbOperation2.Text = "" ThenMsgBox("請(qǐng)輸入操作符")ElseIf txtContent2.Text = "" ThenMsgBox("請(qǐng)輸入要查詢的內(nèi)容")End IfEnd If' 當(dāng)?shù)诙€(gè)組合關(guān)系不為空時(shí) If cmbRelation2.Text <> "" ThenIf cmbField1.Text = "" ThenMsgBox("請(qǐng)輸入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("請(qǐng)輸入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("請(qǐng)輸入要查詢的內(nèi)容")ElseIf cmbField2.Text = "" ThenMsgBox("請(qǐng)輸入字段名")ElseIf cmbOperation2.Text = "" ThenMsgBox("請(qǐng)輸入操作符")ElseIf txtContent2.Text = "" ThenMsgBox("請(qǐng)輸入要查詢的內(nèi)容")ElseIf cmbField3.Text = "" ThenMsgBox("請(qǐng)輸入字段名")ElseIf cmbOperation3.Text = "" ThenMsgBox("請(qǐng)輸入操作符")ElseIf txtContent3.Text = "" ThenMsgBox("請(qǐng)輸入要查詢的內(nèi)容")End IfEnd If'給實(shí)體層傳參Dim enGroupQuery As New Model.GroupQueryMenGroupQuery._field1 = GetDBName(cmbField1.Text.Trim())enGroupQuery._field2 = GetDBName(cmbField2.Text.Trim())enGroupQuery._field3 = GetDBName(cmbField3.Text.Trim())enGroupQuery._operate1 = cmbOperation1.Text.Trim()enGroupQuery._operate2 = cmbOperation2.Text.Trim()enGroupQuery._operate3 = cmbOperation3.Text.Trim()enGroupQuery._content1 = txtContent1.Text.Trim()enGroupQuery._content2 = txtContent2.Text.Trim()enGroupQuery._content3 = txtContent3.Text.Trim()enGroupQuery._relation1 = GetDBName(cmbRelation1.Text.Trim())enGroupQuery._relation2 = GetDBName(cmbRelation2.Text.Trim())enGroupQuery.GetTable = GetTable() '通過函數(shù)的返回值給參數(shù)賦值'給B層GroupQuery方法傳遞參數(shù)Dim FGroupQuery As New Facade.GroupQuertFADim table As DataTabletable = FGroupQuery.GroupQuery(enGroupQuery)If table.Rows.Count = 0 ThenMsgBox("沒有記錄,請(qǐng)重新設(shè)置查詢條件", vbOKOnly, vbExclamation)DataGridView1.DataSource = NothingElseDataGridView1.DataSource = FGroupQuery.GroupQuery(enGroupQuery)End IfEnd Sub' 定義虛函數(shù)GetDBName,獲取不同數(shù)據(jù)庫(kù)的字段名 Protected Overridable Function GetDBName(ByVal control As String) As StringReturn ""End Function' 定義虛函數(shù)GetDBName,獲取不同數(shù)據(jù)庫(kù)的表名 Protected Overridable Function GetTable() As StringReturn ""End FunctionPrivate Sub Button2_Click_1(sender As Object, e As EventArgs) Handles btnExit.ClickMe.Close()End Sub'組合關(guān)系一不為空后,顯示第二行查詢條件Private Sub cmbRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation1.SelectedIndexChangedcmbField2.Enabled = TruecmbOperation2.Enabled = TruecmbRelation2.Enabled = TruetxtContent2.Enabled = TrueEnd Sub'組合關(guān)系二不為空后,顯示第三行查詢條件Private Sub cmbRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation2.SelectedIndexChangedcmbField3.Enabled = TruecmbOperation3.Enabled = TruetxtContent3.Enabled = TrueEnd SubEnd Class</span>
2,在B層,對(duì)D層數(shù)據(jù)庫(kù)的查詢結(jié)果做出處理
<span style="font-size:18px;">Imports Charge.IDAL Imports Charge.Model Public Class GroupQueryBLL''' <summary>''' 根據(jù)組合查詢D層的返回結(jié)果,判斷是否有值''' </summary>''' <param name="enGroupQuery"></param>''' <returns>沒有值,不返回任何東西,有,就返回信息</returns>''' <remarks></remarks>Public Function GroupQueryStudent(ByVal enGroupQuery As Model.GroupQueryM) As DataTableDim factory As New Factory.CreateFactoryDim IGroupQuery As IGroupQuery = factory.CreateGroupQueryDim table As DataTable = IGroupQuery.GroupQuery(enGroupQuery)'檢查D層返回的數(shù)據(jù)表中是否有數(shù)據(jù)If table.Rows.Count = 0 ThenReturn NothingElseReturn tableEnd IfEnd Function End Class</span>
3,在D層對(duì)數(shù)據(jù)進(jìn)行查詢
<span style="font-size:18px;">/********************************************** '類名:SQLGroupQuery '命名空間:ChargeDAL '創(chuàng)建時(shí)間:2015/1/5 20:58:39 '創(chuàng)建人:HXX '修改時(shí)間: '修改人: '版本號(hào):4.0.30319.18449 '說明:實(shí)現(xiàn)組合條件的 '版權(quán):HHX '/********************************************** Imports System.Data.SqlClient Imports System.Data Imports ChargePublic Class SQLGroupQuery : Implements IDAL.IGroupQuery''' <summary>''' 根據(jù)設(shè)置的條件,進(jìn)行信息查詢''' </summary>''' <param name="enGroupQuery"></param>''' <returns>返回查詢結(jié)果信息的集合</returns>Public Function GroupQuery(enGroupQuery As Model.GroupQueryM) As DataTable Implements IDAL.IGroupQuery.GroupQueryDim strSQL As String = "QueryGroup" '調(diào)用存儲(chǔ)過程 Dim prams As SqlParameter() = {New SqlParameter("@cmbField1", enGroupQuery._field1),New SqlParameter("@cmbField2", enGroupQuery._field2),New SqlParameter("@cmbField3", enGroupQuery._field3),New SqlParameter("@cmbOperation1", enGroupQuery._operate1),New SqlParameter("@cmbOperation2", enGroupQuery._operate2),New SqlParameter("@cmbOperation3", enGroupQuery._operate3),New SqlParameter("@txtContent1", enGroupQuery._content1),New SqlParameter("@txtContent2", enGroupQuery._content2),New SqlParameter("@txtContent3", enGroupQuery._content3),New SqlParameter("@cmbRelation1", enGroupQuery._relation1),New SqlParameter("@cmbRelation2", enGroupQuery._relation2),New SqlParameter("@tableName", enGroupQuery.GetTable)} '設(shè)置參數(shù)Dim MyHelper As New SqlHelperDim table As New DataTabletable = MyHelper.ExecSelect(strSQL, CommandType.StoredProcedure, prams)Return tableEnd Function End Class</span> 三、在繼承窗體中的應(yīng)用
在繼承窗體中,需要重寫模板父窗體中的方法,關(guān)鍵點(diǎn)有:字段的轉(zhuǎn)換,數(shù)據(jù)表的返回。
<span style="font-size:18px;"> Private Sub FrmOperateWorkLog_Activated(sender As Object, e As EventArgs) Handles Me.Activated'避免一個(gè)窗體多次打開,或者打開多個(gè)操作窗體Dim frm As Form'遍歷打開了的每一個(gè)窗體For Each frm In Application.OpenForms'如果當(dāng)前窗體不是主窗體或者沒有被打開過If frm.Name <> Me.Name And frm.Name <> FrmMain.Name And frm.Name <> FrmLine.Name Then'其他打開的窗體最小化frm.WindowState = 1End IfNextEnd SubPrivate Sub FrmMaintainInfo_Load(sender As Object, e As EventArgs) Handles MyBase.Load'給字段賦值cmbField1.Items.AddRange({"教師", "注冊(cè)日期", "注冊(cè)時(shí)間", "注銷日期", "注銷時(shí)間", "機(jī)器名"})cmbField2.Items.AddRange({"教師", "注冊(cè)日期", "注冊(cè)時(shí)間", "注銷日期", "注銷時(shí)間", "機(jī)器名"})cmbField3.Items.AddRange({"教師", "注冊(cè)日期", "注冊(cè)時(shí)間", "注銷日期", "注銷時(shí)間", "機(jī)器名"})cmbOperation1.Items.AddRange({"=", "<", ">", "<>"})cmbOperation2.Items.AddRange({"=", "<", ">", "<>"})cmbOperation3.Items.AddRange({"=", "<", ">", "<>"})cmbRelation1.Items.AddRange({"與", "或"})cmbRelation2.Items.AddRange({"與", "或"})End Sub'重寫獲得表名方法Protected Overrides Function GetTable() As StringenGroupQuery.GetTable = "TC_WorkLogInfo"Return enGroupQuery.GetTable()End Function'重寫轉(zhuǎn)換成數(shù)據(jù)庫(kù)字段方法Protected Overrides Function GetDBName(control As String) As StringSelect Case (control)Case "教師"Return "UserID"Case "注冊(cè)時(shí)間"Return "OnTime"Case "注冊(cè)日期"Return "OnDate"Case "注銷時(shí)間"Return "OffTime"Case "注銷日期"Return "OffDate"Case "機(jī)器名"Return "Computer"Case "或"Return "or"Case "與"Return "and"Case ElseReturn ""End SelectEnd Function End Class </span>
到這里,利用窗體繼承和模板方法進(jìn)行組合查詢就算是實(shí)現(xiàn)了。
四、應(yīng)用說明
1,這里的返回類型都是DataTable,如果將其換為L(zhǎng)ist,則就沒有這么簡(jiǎn)單了。還需要多寫一步(存儲(chǔ)過程中),就像返回查詢表格的參數(shù)一樣,將查詢表格的參數(shù)寫到List中的表。
2,這里D層的查詢是通過調(diào)用的存儲(chǔ)過程,對(duì)存儲(chǔ)過程的使用和理解,將在下一篇博客中詳細(xì)說明。不過,在這里可以替換成一種類型,就像是第一次做機(jī)房時(shí)那樣。例(第一次機(jī)房中):
<span style="font-size:18px;">txtSQL = txtSQL & tiaojian(Trim(cobozd1(0).Text)) & Trim(cobocz1(0).Text) & "'" & Trim(txtnr1.Text) & "'" _& " and " _& tiaojian(Trim(cobozd1(1).Text)) & Trim(cobocz1(1).Text) & " '" & Trim(txtnr2.Text) & "'" _& " and " _& tiaojian(Trim(cobozd1(2).Text)) & Trim(cobocz1(2).Text) & " '" & Trim(txtnr3.Text) & "'"</span> 在這里,也可以將存儲(chǔ)過程,換成一般的文本類型查詢。因?yàn)槭菓?yīng)用的參數(shù)賦值,使用字符拼接的方式,將組合查詢的三個(gè)情況看做是一種情況,也是可行的。
五、個(gè)人感想
學(xué)以致用,學(xué)了還要會(huì)用才行。剛開始學(xué)了設(shè)計(jì)模式的時(shí)候,真的感受不大。但用上了之后,真的覺得很方便。只是在用的過程中有點(diǎn)艱難,不過,把一個(gè)個(gè)的問題解決了,最后實(shí)現(xiàn)了,感覺真的很良好。
轉(zhuǎn)載于:https://www.cnblogs.com/hhx626/p/6010455.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的.NET重构(四):窗体继承+模板方法,完美实现组合查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉利星瑞高速追尾气囊未爆!厂家:没撞到点
- 下一篇: ETL模型设计