三、利用EnterpriseFrameWork快速開發Winform系統(C/S)


EnterpriseFrameWork框架實例源代碼下載: 實例下載

 

      上一章講解了開發Web系統的詳細步驟,以書籍的管理作實例實現對書籍的增、刪、改、查功能,本章接着上面的實例繼續補充用Winform界面來實現此功能;

 

本文要點:

1.Winform版界面效果

2.Winform項目開發步驟

3.代碼文件調用關系圖

4.常見問題匯總

 

1.界面效果如下:

 

解決方案目錄結構:


2.上圖紅色部分為這次新增加的文件,開發步驟:

      1)新增Winform控制器,bookwinController.cs

      2)新增界面接口,IfrmBook.cs

      3)新增界面窗口,frmBookManager.cs

     其中實體Book.csDao在上一章實例中已經完成,所以直接調用就行了;

   

bookwinController.cs文件

using System; using System.Collections.Generic; using System.Linq; using System.Text; using EFWCoreLib.WinformFrame.Controller; using Books.WinController.Iviewform; using Books.Dao; using System.Data; using Books.Entity; namespace Books.WinController { [EFWCoreLib.WinformFrame.Controller.Menu]//與系統菜單對應
    [View(DllName = "Books.Winform.dll", ViewTypeName = "Books.Winform.Viewform.frmBookManager", DefaultView = true)] public class bookwinController : BaseController { IfrmBook frmBook; public override void Init() { frmBook = (IfrmBook)DefaultView; //初始化加載書籍目錄
 GetBooks(); } //獲取書籍目錄
        public void GetBooks() { BookDao bdao = NewDao<BookDao>(); DataTable dt = bdao.GetBooks("", 0); frmBook.loadbooks(dt); } //界面點擊新增
        public Book newbook() { return NewObject<Book>(); } //保存
        public void bookSave() { frmBook.currBook.save(); GetBooks(); } } }
View Code

 

      bookwinController類必須繼承框架中的BaseController對象,還必須配置自定義標簽【Menu】和【View】對應菜單和界面對象,控制器中的方法實現界面操作功能;Winform系統開發的真正難點應該就在對於控制器的理解,系統菜單是怎么跟界面關聯起來的?界面與控制器直接的交互又是怎么實現的?這些問題我們放在后面章節中詳細講解,本章先學會怎么使用;

 

IfrmBook.cs文件

using System; using System.Collections.Generic; using System.Linq; using System.Text; using EFWCoreLib.WinformFrame.Controller; using System.Data; using Books.Entity; namespace Books.WinController.Iviewform { public interface IfrmBook : IBaseView { //給網格加載數據
        void loadbooks(DataTable dt); //當前維護的書籍
        Book currBook { get; set; } } }
View Code

 

      IfrmBook接口被界面對象frmBookManager所繼承,它把界面對象所要交互的數據用接口隔離,這樣控制器無需直接操作界面對象frmBookManager,只需依賴IfrmBook接口就行了,實現界面與后台的解耦,當然這種MVC模式不僅僅只是解耦的目的,而是一種新的開發Winform項目的方法,一切業務實現是圍繞控制器進行,而不是界面;因為一個界面並不能展現一個完整的功能或者一個界面包含了多個完整功能,因為界面的設計更多來於用戶的操作友好性;所以業務集中在控制器中,對於我們理解代碼、擴展以及以后得維護都帶來很多好處,以后章節詳細討論

 

frmBookManager.cs文件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using EFWCoreLib.WinformFrame.CustomControl; using Books.WinController.Iviewform; using Books.Entity; namespace Books.Winform.Viewform { public partial class frmBookManager : BaseForm, IfrmBook { public frmBookManager() { InitializeComponent(); frmForm.AddItem(txtbookname, "BookName","必須輸入書籍名稱!"); frmForm.AddItem(txtprice, "BuyPrice"); frmForm.AddItem(txtdate, "BuyDate"); frmForm.AddItem(ckflag, "Flag"); txtdate.Value = DateTime.Now; } #region IfrmBook 成員

        public void loadbooks(DataTable dt) { gridBook.DataSource = dt; } private Book _book; public Books.Entity.Book currBook { get { frmForm.GetValue<Book>(_book); return _book; } set { _book = value; frmForm.Load<Book>(_book); } } #endregion
        //選擇書籍
        private void gridBook_Click(object sender, EventArgs e) { if (gridBook.CurrentCell != null) { int rowindex = gridBook.CurrentCell.RowIndex; DataTable dt = (DataTable)gridBook.DataSource; int Id = Convert.ToInt32(dt.Rows[rowindex]["Id"]); _book = InvokeController("newbook") as Book; _book.Id = Id; //取出網格數據賦值給控件
 frmForm.Load(dt.Rows[rowindex]); } } //新增
        private void btnadd_Click(object sender, EventArgs e) { //清空右邊面板控件數據
            currBook = InvokeController("newbook") as Book; } //保存
        private void btnsave_Click(object sender, EventArgs e) { if (frmForm.Validate()) { InvokeController("bookSave"); } } } }
View Code

 

      界面對象frmBookManager必須繼承框架中的BaseForm對象和上面的IfrmBook接口,界面的控件是第三方控件NotNetBar,總的來說還是比較美觀的;還有界面中用到了兩個自定義控件,DataGrid和frmForm以后會詳細介紹其功能;

      InvokeController("bookSave");調用控制器中的bookSave方法,所有對控制器的調用都是通過InvokeController委托來實現;

 

      還有一點就是注意,界面代碼中的操作事件,“新增”、“保存”里面的代碼都非常簡單,只是向控制器發送一個消息;

      比如:點擊“保存”成功后,一般都會要重新加載網格的數據,這段代碼無需寫在保存之后,而是控制器實現了此功能,

      這說明什么,說明界面上的一些數據聯動都可以由控制器來控制,這要省了界面上多少代碼,界面代碼變得無比的干凈明了,我想你肯定沒有看到過如此簡潔的代碼,這就是我一直堅持的;

 

      當一個非常復雜的界面,如果改造成這種方式,界面代碼至少可以減少一半,1萬行的代碼最后幾千行不到就可以搞定,而且大量減少了全局變量的存在;

這個方式真的只有使用過之后就能感覺到這種味道。。。

 

3.最后我們看下圖,整理一下以上代碼文件的調用關系

 

EnterpriseFrameWork框架實例源代碼下載: 實例下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM