標籤:winform style blog http color os 使用 io strong
上一章講解了開發Web系統的詳細步驟,以書籍的管理作執行個體實現對書籍的增、刪、改、查功能,本章接著上面的執行個體繼續補充用Winform介面來實現此功能;
介面效果如下:
解決方案目錄結構:
紅色部分為這次新增加的檔案,開發步驟:
1)新增Winform控制器,bookwinController.cs
2)新增介面介面,IfrmBook.cs
3)新增介面視窗,frmBookManager.cs
其中實體Book.cs和Dao在上一章執行個體中已經完成,所以直接調用就行了;
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萬行的代碼最後幾千行不到就可以搞定,而且大量減少了全域變數的存在;
這個方式真的只有使用過之後就能感覺到這種味道。。。
三、利用EnterpriseFrameWork快速開發Winform系統(C/S)