機房重構 模板方法 讓組合查詢變簡單

2021-09-03 01:38:13 字數 4715 閱讀 9630

組合查詢是我們在開發機房收費系統中公認比較難實現的模組,但是我告訴你有一種方法可以讓組合查詢變得很簡單,你想知道嗎?聽我慢慢道來。

在準備開發這個功能的時候,我發現它的復用程度很高:介面一樣,控制項布局一樣,查詢方式也一樣,只不過是我查詢的具體內容之間有些差別。仔細一想,這不就跟模板方法一樣嗎。

模板方法:定義乙個操作中的演算法的骨架(組合查詢父窗體),而將一些步驟延遲到子類中(子窗體獨有的屬性)。

知道了這些之後,組合查詢功能就有了,我們首先要建立乙個組合查詢父窗體模板:

簡單**實現:

u層

/// /// 定義乙個個虛方法  getdbtablename 在子窗體重寫

///

///

public virtual string getdbtablename()

//定義乙個字典,匹配資料庫中欄位名

protected dictionarydic = new dictionary(),,

,

……

……

, ,};

public combineinquiry()

private void combineinquiry_load(object sender, eventargs e)

//查詢功能

private void btninquiry_click(object sender, eventargs e)}}

//例項化外觀層 實體層

facadegroupfindtemplate facadeboolgroupfindtemplate = new facadegroupfindtemplate();

groupfindtemplate_info groupfindtemplate = new groupfindtemplate_info();

//給實體層傳值

groupfindtemplate.dbtablename = getdbtablename();

groupfindtemplate.cbofield1 = dic[cbofield1.text.trim()];

groupfindtemplate.cbofield2 = dic[cbofield2.text.trim()];

groupfindtemplate.cbofield3 = dic[cbofield3.text.trim()];

groupfindtemplate.cbomark1 = cbomark1.text.trim();

groupfindtemplate.cbomark2 = cbomark2.text.trim();

groupfindtemplate.cbomark3 = cbomark3.text.trim();

if (txtcontent1.enabled==true)

else

groupfindtemplate.relationship1 = dic[cboconbination1.text.trim()];

groupfindtemplate.relationship2 =dic[cboconbination2.text.trim()];

//判斷是否查詢成功

bool result = false;

result = facadeboolgroupfindtemplate.boolgroupfindtemplate(groupfindtemplate);

if (result==true)

else

}/// /// 清空+控制項初始化

///

///

///

private void btnclear_click(object sender, eventargs e)

else if (control is combobox)

}//清空組合關係框內容

cboconbination1.selectedindex = -1;

cboconbination2.selectedindex = -1;

datatable table = null;

datagridview1.datasource = table;

//控制項的初始化

cbofield2.enabled = false;

cbofield3.enabled = false;

cbomark2.enabled = false;

cbomark3.enabled = false;

txtcontent2.enabled = false;

txtcontent3.enabled = false;

cboconbination1.enabled = false;

cboconbination2.enabled = false;

}/// /// 如果選擇了第乙個組合關係,下一行資訊可選

///

///

///

private void cboconbination1_selectedindexchanged(object sender, eventargs e)

/// /// 當第一行所有的內容新增完畢,第乙個關係下拉框被啟用

///

///

///

private void txtcontent1_textchanged(object sender, eventargs e)

}/// /// 當第二行所有的內容新增完畢,第二個關係下拉框被啟用

///

///

///

private void txtcontent2_textchanged(object sender, eventargs e)

}/// /// 構造乙個沒有返回值的虛方法,子窗體根據自身內容來例項化

///

///

///

public virtual void addcontent(combobox field, combobox mark)

/// /// 根據field的內容 來新增mark中的符號 (這裡只給出乙個,因為後面兩個和第乙個一樣)

///

///

///

private void cbofield1_selectedindexchanged(object sender, eventargs e)

else

/// /// 匯出為excel表,呼叫封裝好的exportexcel方法

///

///

///

private void btnexcel_click(object sender, eventargs e)

/// /// 如果是時間控制項,在第一行所有內容都填滿之後,第乙個組合關係可使用

///

///

///

private void datetimepicker1_valuechanged(object sender, eventargs e)

}

private void datetimepicker2_valuechanged_1(object sender, eventargs e)

}

d層也很簡答,因為我用了儲存過程。

public class dalgroupfindtemplate:idalgroupfindtemplate

;string sql = "proc_groupcheck";

datatable dt = sqlhelper.executequery(sql, sqlparams, commandtype.storedprocedure);

return dt;

}

ok,父窗體搞定,下面開始解決子窗體。以學生基本資訊查詢為例,只需要在u層做簡單改動即可。

/// /// 重寫父窗體addcontent方法,匹配對應的欄位名和操作符

///

///

///

public override void addcontent(combobox field, combobox mark)

}/// /// 返回要查詢的表名

///

///

public override string getdbtablename()

/// /// 在datagridview表中加入對應的標頭

///

///

///

private void btninquiry_click(object sender, eventargs e)

}/// /// 新增字段

///

///

///

private void frmopstumaintenance_load(object sender, eventargs e)

;cbofield1.items.addrange(field);

cbofield2.items.addrange(field);

cbofield3.items.addrange(field);}}

模板方法到這裡就已經結束了,用了模板方法之後是不是有一種一勞永逸的感覺?哈哈。

機房重構之組合查詢

組合查詢,不好弄,因為需要有模板模式。不過經過問別人看部落格之後,也算是理解著弄完了。只是弄完了不行啊,得總結啊,那就總結吧。我理解的模板方法就是先建立乙個父模板,然後讓子類來繼承父類,使用父類的功能。public virtual void todgv entity.groupcheck group...

蠡測機房重構之組合查詢

寫在前邊的話 在進行機房重構的過程中,設計組合查詢的窗體,真的是學到了很多東西。以管窺豹,以蠡測海,所以想小小的總結一下,緬懷這一寸寸學習的時光。設計模式之模板方法的運用 模板方法模式 在乙個抽象類中定義乙個操作中的演算法骨架,而將一些步驟延遲到子類中去實現。模板方法使得子類可以不改變乙個演算法的結...

機房重構 組合查詢(知識點總結)

昨天把組合查詢敲完了,過程查了不少的部落格,下面總結下遇到的知識點 組合查詢就是多條件查詢,一條查詢語句where後面的條件很多,而在機房中設計到組合查詢的很多,就用到了模板方法 官方定義 定義乙個操作中的演算法骨架,而將一些步驟延遲到子類。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算...