從事Winform開發框架的研究和推廣,也作了有幾個年頭了,從最初的項目雛形到目前各類重要特性的加入完善,是通過了不少項目的總結概括和昇華,有些則是根據客戶須要或者應用前景的須要進行的完善,整個Winform開發框架具備很好的通用性和借鑑性,本文從該Winform開發框架進行歸納總結,力求把各個重要的特性進行一些詳細的說明,使你們瞭解整個Winform開發框架的面貌和特性。html
Winform開發框架整體性歸納有:支持插件化應用開發,可以動態配置及加載開發的插件;菜單支持動態配置,可根據用戶權限進行動態控制顯示;集成各類獨立開發好的模塊,如權限管理系統、字典管理模塊等,自動更新模塊等,實現系統的權限控制、字典管理、軟件支持遠程自動更新等功能;可重複使用的系統基礎模塊,Winform分頁控件和.NET開發公用類庫等;整個框架經過與代碼生成工具Database2Sharp進行配合,可以一鍵生成總體性框架代碼,Winform系統界面代碼,開發更高效。sql
整個Winform開發框架,提供了不少常見業務系統提供的功能,包括Excel數據導入導出,能快速導入自定義模塊的Excel數據,快速導出列表數據;自定義Excel自定義模板報表的生成,生成各類複雜的Excel報表;強大通用的統計圖表模塊,數據統計更方便;基於多數據的數據查詢模塊和通用高級查詢模塊,查詢數據更方便;框架提供基於多種數據庫(Sqlserver/Oracle/Mysql/Sqlite/Access)的整合,可以手動配置數據庫類型,通用模塊內置支持多種數據庫切換;框架提供了高度封裝的數據訪問基類,開發代碼更少更高效;框架界面基類也進行統一封裝,使用更方便,效果更統一;框架提供基礎性的支持,包括集成登錄、閃屏、托盤功能,以及爲插件模塊提供登錄用戶信息和系統信息。數據庫
Winform開發框架的主要功能概覽以下圖所示。網絡
框架實現基於插件化的應用,以下所示。多線程
支持插件化應用的開發框架能給程序帶來無窮的生命力,也是目前不少系統、程序追求的重要方向之一,插件化的模塊,在遵循必定的接口標準的基礎上,能夠實現快速集成,也就是所謂的熱插拔操做,能夠無限對已經開發好系統進行擴展,並且不會影響已有的功能,再也不須要的模塊,經過修改配置移除便可。架構
插件化應用也是目前框架和系統開發的主流方向,從開發企業的產品管理角度來看,第一能夠把控好已有的框架產品,第二能夠把內部的人員分配到不一樣的業務模塊中,讓他們遵循必定的接口便可快速開發,從而提升團隊對業務模塊的橫向切割和快速開發的效率,更好、統1、高效完成企業化應用框架的搭建和使用。框架
通常Winform程序中,菜單都是直接寫在主程序中的,這樣對於修改和維護菜單的相關信息,可能有所不便,並且對於插件化應用,新增菜單是常見的事情,這樣就須要對菜單進行動態配置管理了,經過後臺菜單的配置和權限的指定,可以實現菜單的動態加載和權限驗證。工具
所以菜單也是權限分配的一部分,爲了有效管理菜單資源,咱們把菜單放到權限管理系統中進行管理控制。post
設定好菜單的圖標和Winform窗體類型,就能在Winform框架中動態構建菜單信息了。菜單的圖表放置在系統的相對目錄下便可。學習
權限的分配和管理,基本上是每一個業務系統須要考慮的東西,而這些經常使用的東西,在整個Winform開發框架中,把它做爲一個獨立的模塊,既方便維護管理,也留有接口很容易進行集成,這樣可以在項目中反覆進行使用。
權限系統須要考慮的系統用戶、組織機構、角色、權限定義及分配、菜單管理、用戶登陸日誌等相關信息。對於每新增一個系統,咱們只須要在權限管理系統中增長一個系統類型定義,以及相關的功能、菜單數據便可,很是方便管理。
另外,除了權限的管理,字典管理也是常規業務模塊的一個總要功能,所以字典管理模塊在Winform開發框架中,也是一個獨立的模塊進行開發管理,在使用的時候進行集成便可。
字典的分類能夠按多級進行分類管理,能夠拖拉進入新的分類,很是方便。
通常狀況下,爲了有效管理應用程序的發佈及更新,咱們須要軟件支持遠程自動更新功能;在Winform開發框架中再引入一個自動升級更新的通用模塊,這個自動升級的通用模塊除了具有通常的功能外,能夠經過配置程序標題、升級路徑方式等方式,實現通用化的升級操做,其餘須要升級的程序,拿過來就可使用,通過項目的整合及優化,已經具有較好的應用前景了。
本通用自動更新模塊具備下面幾個特色:
1)程序標題可配置,更新路徑可配置,適用於各類須要更新的項目整合。
2)支持文件複製或者對壓縮包進行解壓,適合更多瑣碎程序集的總體升級。
3)支持文件更新後自動啓動,或者帶參數的啓動方式。
爲了提升數據的獲取及顯示效率,通常狀況下,咱們都須要對數據進行分頁獲取和顯示,在網絡化環境,這種方式獲取數據特別重要,在Winform裏面,沒有現成的分頁控件可使用,所以出於這個考慮,把數據顯示、數據導出、數據打印等衆多功能集成一塊兒,更加方便使用。分頁控件完美支持列表數據的分頁,能夠調整顯示列及順序,是否顯示覆選框,字段別名,奇偶列的顏色變化,列信息提示和數據複製等等衆多實用細緻的功能的。
列表的數據綁定及顯示代碼,經過代碼生成工具,能夠一鍵生成所需的界面代碼,開發效率飛通常的提高。
俗話說,一個好漢十個幫,衆人拾柴火焰高等都說明一個道理,有更多的資源,更豐富的積累,都是助你走向成功,走向頂峯的推進力。就咱們開發者而言,其中技巧的積累、資源的積累,就是相似一個個好漢、一根根好柴,是咱們可以進行高效開發的保證和推進力。
這些類庫是我從事多年軟件開發,逐漸提煉和發現的一些閃光點或者好片斷,有些是吸取別人的優秀的東西,有些是本身逐步提煉的精華,之前,在網絡上看到一些開源的項目,總會先看看其是否有封裝良好、功能獨立的輔助類庫,發現好的輔助類庫,老是欣喜若狂好一陣子,學習中逐步積累,研究中逐漸提煉,多年事後,略有小成,終爲今天所介紹的輔助類庫集合。這些輔助類庫平時也並非全部的都會用得上,不過一些經常使用的,幾乎各個項目就會用到,類庫涉及面很是廣,可以爲咱們開發節省不少時間,而且咱們也能夠根據本身的須要進行擴充完善,造成本身的類庫集合。
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(1)----開篇總結
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(2)----經常使用操做
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(3)----數據庫相關操做
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(4)----CSV、Excel、INI文件、獨立存儲等文件相關
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(5)----熱鍵、多線程、窗體動畫凍結等窗體操做
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(6)----全屏截圖、圖標獲取、圖片打印、頁面預覽截屏、圖片複雜操做等
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(7)-----聲音播放、硬件信息、鍵盤模擬及鉤子、鼠標模擬及鉤子等設備相關
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(8)----非對稱加密、BASE64加密、MD5等經常使用加密處理
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(9)----各類經常使用輔助類
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(10)---各類線程同步的集合類
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(11)---各類線程相關操做類
厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(12)--- 網絡相關操做輔助類
整個框架經過與代碼生成工具Database2Sharp進行配合,可以一鍵生成總體性框架代碼,Winform系統界面代碼,開發更高效。
在整個Winform開發框架中,Database2Sharp生成出來的代碼體現了很是完美的整合性,可以無縫接入開發的框架系統中,不管是常規的業務邏輯和數據訪問層代碼,以及一些列表、編輯界面的Winform界面代碼,都能快速生成,稍做調整便可知足業務模塊的須要。
Database2Sharp是一個簡單點擊幾回鼠標就能完成一週代碼量的代碼生成工具,效率驚人、友好體貼,真正的開發好伴侶。提供了對SqlServer 2000、SqlServer 200五、Oracle、Mysql、Access、SQLite的支持;能夠生成各類架構代碼、Winform界面代碼,而且和Winform開發框架完美整合,體現出更高的開發效率。
因爲通常的業務系統,常常性的數據導入時很正常的業務需求,由於畢竟使用Excel來操做數據也很方便,或者因爲系統之間的數據交換須要,咱們須要提供一個入口給客戶導入所須要的數據。可是導入數據的時候,不一樣的業務數據對應不一樣的Excel文件,很難作到統一,但若是是每一個業務模型,都建立一個不一樣的導入界面來操做Excel數據,又會以爲可能某種程度上重複勞動,增長開發及維護成本。
那麼有無一種介於二者之間的方法,來實現效率的最優化,而且可以統一利用好一個導入的界面呢,在開發領域,只要能想到的,通常也能作到,因爲工做的須要,在個人Winform開發框架中引入了一個通用的數據導入模塊,來實現這個既是統一,又是變化的業務需求。Winform框架提供的個通用的Excel數據導入導出機制,經過代碼生成工具Database2Sharp自動生成的代碼,就包含了如何使用這個通用導入模塊的相關代碼以及該模塊的導出數據的代碼,咱們要作的就是在系統運行起來,導出一些數據做爲某個模塊的Excel模板便可。下面的功能按鈕就是使用代碼生成工具自動生成的界面包含的按鈕。
通用數據導入功能,包含下面幾個方面的內容。
下面就是一個實際生成的功能模塊,其導入界面的運行效果。
在最底的狀態欄裏面,但咱們保存數據的時候,會調用後臺線程進行數據保存,並顯示數據導入的進度狀態,因爲是採用後臺線程處理,不會阻塞當前的界面,在多文檔的Winform開發框架界面中,能夠切換到其餘業務界面進行其餘處理,不影響總體界面操做。
不少狀況下,咱們須要生成比較專業的Excel模塊,所以自定義模板報表就是一種很好的方案,Winform開發框架提供了多種自定義Excel報表的生成。
使用普通的二維表,雖然能知足大多數的狀況,不過在通常的業務中,自定義模板的報表根據貼近實際,符合客戶的要求,雖然自定義模板的報表,比普通的二維報表複雜一些,不過利用Apose.Cell控件,並在預設模板中預設變量,能夠生成很複雜的報表。
具體的自定義模板報表能夠參考下我總結的兩篇文章。
使用Aspose.Cell控件實現Excel高難度報表的生成(一)
使用Aspose.Cell控件實現Excel高難度報表的生成(二)
例如生成一個標準的出庫單,這個表單有表頭信息,列表數據信息,並不是一個普通的二維表,並且這種格式比較固定,所以很適合自定義模塊報表的生成操做。
其餘設計模板以下所示:
實際生成的報表以下所示:
統計圖表在不少項目均可能用到,集成到框架中,更方便你們對一些圖表項目的設計理解以及功能的重用。在通常的傳統的框架中,能夠採用ZedGraph開源控件或者微軟自帶的MSChart進行圖表設計,DevExpress控件套件有本身的圖表控件,這裏主要介紹基於DevExpress控件的圖表控件進行圖表設計。
這裏指的普通統計圖表,只是對錶某一項目進行單一的統計,能夠從餅狀圖、柱狀圖的圖表中體現這些項目各自所佔的比例和數值,在Winform框架中的普通統計圖表模塊中,包括了餅狀圖、柱狀圖和數據表格,這樣更方便對數據進行全面的分析和查看。整個模塊是能夠重用的,指定字段屬性就能夠比較合理的展示出不一樣分類項目的統計效果了,具體效果圖以下所示。
上面的統計圖表中,還包含了下面兩個功能模塊,以下所示。
8.2 動態項目統計圖表
有時候,對於表裏面的數據,可能要對不一樣類型的內容進行動態的統計,以肯定他們各自的比例狀況,那麼這些動態項目的統計圖表就比較合適了,例如,對於病人資料的管理,可能須要統計各類病種所佔的比例或者各類職業類型的犯病率,這些不太肯定的統計項目,就須要一個可以支持動態項目的統計圖表進行支撐,對於本Winform框架,爲了較好呈現這個類型報表的意義,我選擇了對備件類型所佔的比例進行一個統計分析,獲得下面的統計圖表,以下所示。
上面的圖表統計,除了可以根據一些條件進行限定查詢範圍外,還能夠對一些預設的統計字段進行動態選取,而後根據字段裏面的各類內容(統計項目)進行統計,這樣就能夠比較有效的統計出各類類型的數值和比例了。
在Winform框架裏面,能夠對某一年各月份的出入庫數量進行一個分析,獲得下面的統計圖。
以上數據很少,展示可能不太好看,下面我給出我另外一個軟件系統的界面,其中對病人的出入院記錄進行一個統計對比分析,統計報表以下所示。
在個人Winform開發框架中,使用了一個查詢輔助類SearchCondition來實現查詢條件的獲取和轉化,這個輔助類內置了對多種數據庫條件的分析處理,所以可以很好生成所須要的數據查詢條件,正確高效獲取所需的數據進行顯示。
/// <summary> /// 根據查詢條件構造查詢語句 /// </summary> private string GetConditionSql() { //若是存在高級查詢對象信息,則使用高級查詢條件,不然使用主表條件查詢 SearchCondition condition = advanceCondition; if (condition == null) { condition = new SearchCondition(); condition.AddCondition("ItemName", this.txtName.Text, SqlOperator.Like) .AddCondition("ItemBigType", this.txtBigType.Text, SqlOperator.Like) .AddCondition("ItemType", this.txtItemType.Text, SqlOperator.Like) .AddCondition("Specification", this.cmbSpecNumber.Text, SqlOperator.Like) .AddCondition("MapNo", this.txtMapNo.Text, SqlOperator.Like) .AddCondition("Material", this.txtMaterial.Text, SqlOperator.Like) .AddCondition("Source", this.txtSource.Text, SqlOperator.Like) .AddCondition("Note", this.txtNote.Text, SqlOperator.Like) .AddCondition("Manufacture", this.txtManufacture.Text, SqlOperator.Like) .AddCondition("ItemNo", this.txtItemNo.Text, SqlOperator.LikeStartAt) .AddCondition("WareHouse", this.txtWareHouse.Text, SqlOperator.Like) .AddCondition("Dept", this.txtDept.Text, SqlOperator.Like) .AddCondition("UsagePos", this.txtUsagePos.Text, SqlOperator.Like) .AddCondition("StoragePos", this.txtStoragePos.Text, SqlOperator.Like); } string where = condition.BuildConditionSql().Replace("Where", ""); return where; }
/// <summary> /// Sql的查詢符號 /// </summary> public enum SqlOperator { [Description("Like 模糊查詢")] Like, [Description("Not LiKE 模糊查詢")] NotLike, [Description("Like 開始匹配模糊查詢,如Like 'ABC%'")] LikeStartAt, [Description("= 等於號")] Equal, [Description("<> (≠) 不等於號")] NotEqual, /// <summary> /// > 大於號 /// </summary> [Description("> 大於號")] MoreThan, [Description("<小於號")] LessThan, [Description("≥大於或等於號 ")] MoreThanOrEqual, [Description("≤ 小於或等於號")] LessThanOrEqual, [Description("在某個字符串值中")] In }
另外,一個好的數據查詢 ,通常有一個強大的高級查詢模塊,這個模塊在不少程序中都很常見,也是給客戶擴展查詢的一個很好的補充,因爲我一直但願個人Winform開發框架可以精益求精,因此作了這個通用高級查詢模塊,但願對從此我本身全部的項目以及框架自己,都能高效的使用。
在介紹輸入條件的時候,咱們注意到,查詢輸入,基本上能夠分爲幾類:其一是常規的文本類型,使用文本框替代便可;其二是下拉列表類型,用戶從列表下面選擇內容;其三是日期類型,須要用戶指定開始日期和結束日期;其四是數字類型,須要用戶指定起始和結束的數值。
1)常規的文本類型條件輸入界面:
2) 下拉列表類型條件輸入界面:
3) 日期類型條件輸入界面:
4) 數字類型條件輸入界面:
雖然咱們在實際項目中,通常採用一種數據庫進行處理,可是不一樣的項目,採用的數據庫類型可能不一樣,本Winform開發框架爲了方便演示和擴展的須要,內置支持了Sqlserver/Oracle/Mysql/Sqlite/Access,更多的數據庫,也能夠經過擴展數據庫訪問基類的方式進行更多數據庫的支持。
Winform開發框架裏面的全部模塊,如用到了數據存儲的,如權限管理管理模塊、通用數據字典管理模塊,均內置支持這幾種數據庫的整合支持。整個Winform開發框架的數據庫訪問,可以手動配置數據庫類型,對於同一種數據庫,也能夠把數據存儲分開存儲,如業務數據存儲在一個數據庫,權限管理控制存儲在另一個數據庫這種方式。
Winform開發框架提供多種數據庫支持,數據訪問基類依然很精簡,由於咱們利用的數據庫訪問模塊是EnterpriseLibrary,把數據庫抽象化,而且我把全部數據庫通用操做放在了一個超級基類上,具體的數據庫基類只須要實現變化的部分便可。業務訪問類則使用泛型進行封裝處理。
所以,Winform開發框架提供了高度封裝的數據訪問基類,開發代碼更少更高效。
爲了更好開發經常使用界面模塊,Winform開發框架把一些公用的界面模塊,統一放置在了一個BaseUI的項目中,把其中的通用高級查詢、通用數據導入模塊、常見處理界面基類,插件接口等模塊放在一塊兒,根據易於管理和使用。這樣開發的模塊,重用不少常規的界面,開發效率更快,使用更方便,效果更統一了。
整個Winform開發框架,是有一個框架啓動模塊進行集中處理的,系統啓動後,用戶登陸處理後,經過動態加載菜單和插件模塊,並在主體框架界面中進行展現,提供權限控制和登陸用戶信息等方面的框架支持。另外框架支持閃屏圖片的動態配置,系統激活熱鍵和托盤縮小燈功能。
因爲系統登陸後,框架自己存儲了用戶登陸和權限信息,框架動態加載某個模塊後,會把用戶信息和權限控制信息,注入到模塊的界面基類中,所以插件的界面模塊只要是繼承了BaseUI的界面基類,就可以獲取到用戶信息和權限控制信息了。
Winform框架,自己就是爲了可以快速開發一個高效、穩定、美觀大方、擴展性強的應用軟件系統。所以我在本身十年左右的共享軟件開發生涯以及公司項目開發中,不斷思考,精雕細琢,對不少重要的特性都進行了概括和昇華,吸取項目中好的閃光點,借鑑一些好的軟件開發思路,力求把軟件作的更好;在開發效率方面,除了開發一些常規通用的模塊、在模塊內部又充分考慮繼承、重用的規則,還對大幅度提升效率的代碼生成工具,根據Winform開發框架的實現思路和特色,進行了完善優化,使得不管在業務代碼生成,仍是在界面代碼生成方面,均能把開發效率發揮到極致,但願整個Winform開發框架可以持續發揮它的魅力和吸引力,爲更多的人帶來但願,體驗開發的樂趣。