最近項目確實忙,但也是一直忙於有關項目和框架技術的事情,也一直致力於改善我的WInform開發框架.使得自己及客戶使用起來更加方便,更加友好,更加高效。
在很多程序模塊中都很常見,也是給客戶擴展查詢的一個很好的補充,由於我一直希望我的Winform開發框架能夠精益求精,所以做了這個模塊,希望對今后我自己所有的項目以及框架本身,都能高效的使用。
1、通用高級查詢模塊的用途及介紹
既然稱之為通用查詢模塊,那么他就不能與具體的表字段有耦合關系,但是要實現具體的查詢,必須通過某種方式進行屬性傳遞,實現更直觀友好的字段查詢功能。高級查詢模塊,在很多完善的程序上都會提供,用於滿足用戶對特定的字段,添加特定的條件進行,因為一般情況下,由於版面的限制界面上查詢的內容比較有限,只是把一些很常見、重要的字段作為查詢輸入,如果表字段比較多,那么對有些特殊的字段就無所適從。
如這個程序來講 字段信息比較少不明顯. 做為常用查詢的字段一般情況下是不能太多字段的,因為那樣頁面顯示的就會臃腫的難看。
我的高級查詢查詢模塊也是基於這個道理,因此,在主界面增加一個高級查詢按鈕入口,如上圖所示,單擊后,顯示一個所有字段的列表,如下界面。
看到上面這樣是不是即熟悉又新其呢,新奇是因為以往做的高級查詢是一個表格第一列是標題,第二行是輸入的值再進行轉換。而我這次做的是模仿用友的U9產品做的查詢方案。即滿足對高級查詢的需要又擴展了查詢方案進行保存。
在介紹輸入條件的時候,我們注意到,查詢輸入,基本上可以分為幾類:其一是常規的文本類型,使用文本框控件;其二是表格翻譯的列就采取了下拉列表控件進行展現;其三是日期類型,需要用戶指定開始日期和結束日期,也就用了自定義日期范圍控件(為了方便,都可以單獨輸入其中的一部分作為條件進行高級查詢。);其四是數字類型,也是采用的文本框進行格式化,為什么不用范圍而是可以選擇查詢的符號,這也是與其它人做高級查詢的不同之處。其五,復選框我們也做了處理。
查詢后會保留用戶的輸入,第二次打開界面后,會加載之前的輸入條件,這樣比較人性化一些。同時可以保存查詢方案,供下次登錄系統選擇查詢方案就可以帶出當時查詢的條件,再次查詢使用。另可以把查詢方案共享給其它人,也可以只自己能看到。
2、通用高級查詢模塊的實現思路
有很多人做的時候就根據表結構或者視圖結構來做的,這樣就會有一個限制就是在查詢時用的不是表和視圖,而是多表關聯查詢,高級查詢的字段就會不全了,另原因表的字段很多不一定全部作為查詢條件。
我為了使用更簡單更方便而我采取了從顯示的內容來獲取查詢的字段進行處理。
這樣調用起來就很非常的簡單,一行代碼就搞定了。
string whereSql = this.ShowAdvancedQuery(this.grvGridView);
1.用傳過來的gridView進行解析每一列使用的控件情況。
private void ShowQueryControl() { foreach (GridColumn gridColumn in GridView.Columns) { string fieldName = gridColumn.FieldName; if (!fieldName.Equals(BusinessLogic.SelectedColumn)) { string name = gridColumn.Caption; Type type = gridColumn.ColumnType; 。。。。。。。。。。 } } }
2.在上面解析查詢字段和控件的時候還需要查詢的符號
#region 符號下拉列表 int txtNotationWidth = 90; private ImageComboBoxEdit GetNotationImageComboBoxEdit(string fieldName) { ImageComboBoxEdit comboBox = BaseInterfaceLogic.CreateImageComboBoxEdit("cmbNotation" + fieldName, null, null, txtNotationWidth, "Notation");// comboBox.Properties.Items.Clear(); comboBox.Properties.Items.Add(new ImageComboBoxItem("包含", "Like")); comboBox.Properties.Items.Add(new ImageComboBoxItem("不包含", "NotLike")); comboBox.Properties.Items.Add(new ImageComboBoxItem("左包含", "StartWith")); comboBox.Properties.Items.Add(new ImageComboBoxItem("右包含", "EndWith")); comboBox.Properties.Items.Add(new ImageComboBoxItem("等於", "Equal")); comboBox.Properties.Items.Add(new ImageComboBoxItem("不等於", "NotEqual")); comboBox.Properties.Items.Add(new ImageComboBoxItem("大於", "Greater")); comboBox.Properties.Items.Add(new ImageComboBoxItem("小於", "Less")); comboBox.Properties.Items.Add(new ImageComboBoxItem("大於等於", "GreaterEqual")); comboBox.Properties.Items.Add(new ImageComboBoxItem("小於等於", "LessEqual")); comboBox.Properties.Items.Add(new ImageComboBoxItem("時間范圍", "DateRange")); //comboBox.Properties.Items.Add(new ImageComboBoxItem("空", "Null")); //comboBox.Properties.Items.Add(new ImageComboBoxItem("非空", "NotNull")); //comboBox.Properties.Items.Add(new ImageComboBoxItem("兩者之間", "Between")); comboBox.SelectedIndex = 0; return comboBox; } #endregion
3.顯示完成后,點擊查詢后需要從頁面控件進行反解析處理
下面是反解析條件的關鍵代碼。
foreach (Control control in scrollableControlQuery.Controls) { if (control is FlowLayoutPanel) { panel = (FlowLayoutPanel)control; foreach (Control childControl in panel.Controls) { //05.普通下拉框 if (childControl is ImageComboBoxEdit) {} } } }
4. 和普通查詢功能並存
為了使得傳統查詢按鈕,和高級查詢能夠並存,我們需要存儲一個高級查詢的查詢對象,但傳統查詢的時候,我們把高級查詢對象設置為空即可屏蔽高級查詢的條件了。
在上面代碼也可以看到,查詢方案點擊查詢后只會返回組裝好的sql條件給了 public string QueryWhere = string.Empty;屬性。之后想要怎么使用就是程序說的算了。使我們的程序能夠盡量滿足客戶的需求,獲得更加好的反饋和支持了。
項目中使用完整代碼如下:
#region 高級查詢事件處理 /// <summary> /// 高級查詢事件處理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSearchA_Click(object sender, EventArgs e) { string whereSql = this.ShowAdvancedQuery(this.grvGridView); if (!whereSql.Equals(ShowAdvancedQueryCancel)) { this.Search(whereSql); } } #endregion
從上面來看,其實我這次做的高級查詢在行業內是比較簡單實用的。而且還增加了查詢方案進行存儲。也算是行內比較標准的做法了。其它人可以進行效仿了。
當然這個查詢方案還不滿足於現在的功能,之后還要擴展排序規則和顯示的欄目控制。
-------------------------------------------------------------------------------------------
作者: 王春天 2015-10-21
作者Blog:http://www.cnblogs.com/spring_wang 出處: http://www.cnblogs.com/spring_wang/p/4874584.html
如果覺得還不錯,歡迎轉載。
SNF快速開發平台框架的系列文章:
SNF開發平台WinForm之十-Excel導入http://www.cnblogs.com/spring_wang/p/6128604.html
SNF開發平台WinForm之九-代碼生成器使用說明http://www.cnblogs.com/spring_wang/p/6128595.html
SNF開發平台WinForm之八-自動升級程序部署使用說明http://www.cnblogs.com/spring_wang/p/6128570.html
SNF開發平台WinForm之七-單據打印和使用說明http://www.cnblogs.com/spring_wang/p/6126016.html
SNF開發平台WinForm之六-上傳下載組件使用http://www.cnblogs.com/spring_wang/p/6125929.html
SNF開發平台WinForm之五-高級查詢使用說明-http://www.cnblogs.com/spring_wang/p/6116640.html
SNF開發平台WinForm之四-開發-主細表管理頁面-http://www.cnblogs.com/spring_wang/p/6116626.html
SNF開發平台WinForm之三-開發-單表選擇控件創建-http://www.cnblogs.com/spring_wang/p/6116592.html
SNF開發平台WinForm之二-開發-單表表單管理頁面-http://www.cnblogs.com/spring_wang/p/6116572.html
SNF開發平台WinForm之一-開發-單表表格編輯管理頁面-http://www.cnblogs.com/spring_wang/p/6116523.html
Winform開發框架之通用高級查詢模塊--SNF快速開發平台3.3-Spring.Net.Framework
Winform開發框架之圖表報表在線設計器2-圖表-SNF.EasyQuery項目--SNF快速開發平台3.3-Spring.Net.Framework
Winform開發框架之圖表報表在線設計器-報表-SNF.EasyQuery項目--SNF快速開發平台3.3-Spring.Net.Framework(
Winform開發框架之通用附件管理模塊 --SNF快速開發平台3.3-Spring.Net.Framework
SNFAutoupdater通用自動升級組件V2.0-WinForm
SNF快速開發平台3.2之--.Net可擴展的單據編號生成器-SNF.CodeRule
SNF快速開發平台3.1之--審核流(3)低調奢華,簡單不凡,實例演示-SNF.WorkFlow
SNF快速開發平台3.1之--審核流(2)流程設計-SNF.WorkFlow功能使用說明
SNF快速開發平台3.1之--審核流(1)SNF.WorkFlow審核流簡介
SNF快速開發平台3.0之--完美的代碼生成器SNF.CodeGenerator-快速開發者的利器
基於MVC4+EasyUI的Web開發框架--Spring.Net.FrameworkV3.0總體介紹
SNF快速開發平台3.0之--文件批量上傳-統一附件管理器-在線預覽文件(有互聯網和沒有兩種)
SNF快速開發平台3.0之--asp.net mvc4 強大的導出和不需要上傳文件的批量導入EXCEL
SNF快速開發平台3.0之MVC通用控件庫展示-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout
SNF快速開發平台3.0之BS頁面展示和九大優點-部分頁面顯示效果-Asp.net+MVC4.0+WebAPI+EasyUI +Knockout
SNF快速開發平台3.0之-界面個性化配置+10種皮膚+7種菜單-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout
SNF快速開發平台3.0之-CS頁面-Asp.net+Spring.Net.Framework
SNF快速開發平台3.0之--系統里廣播的作用--迅速及時、簡明扼要的把信息發送給接收者