組合查詢是我們在開發機房收費系統中公認比較難實現的模組,但是我告訴你有一種方法可以讓組合查詢變得很簡單,你想知道嗎?聽我慢慢道來。
在準備開發這個功能的時候,我發現它的復用程度很高:介面一樣,控制項布局一樣,查詢方式也一樣,只不過是我查詢的具體內容之間有些差別。仔細一想,這不就跟模板方法一樣嗎。
模板方法:定義乙個操作中的演算法的骨架(組合查詢父窗體),而將一些步驟延遲到子類中(子窗體獨有的屬性)。
知道了這些之後,組合查詢功能就有了,我們首先要建立乙個組合查詢父窗體模板:
簡單**實現:
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後面的條件很多,而在機房中設計到組合查詢的很多,就用到了模板方法 官方定義 定義乙個操作中的演算法骨架,而將一些步驟延遲到子類。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算...