如何使用MVC編寫Winform程序代碼

efwplus開源框架官網:www.efwplus.cn數據庫

 

前提:業務分析設計已完成,界面設計完成app

 
1.代碼結構劃分
1)界面層:FrmSugeryApplyList、ISugeryApplyList
2)控制器層:SugeryApplyController
3)模型:無(使用DataTable存儲數據,無實體類)
 
2.ISugeryApplyList的設計
1)界面上控件加載數據和獲取控件數據
注:「控件五」內的控件由於是同時顯示數據,或同時保存數據,因此咱們當成一個控件處理,保持接口的簡潔
public interface ISugeryApplyList:IBaseView
    {
        //加載控件數據
        void loadPatientList(DataTable dt);//控件一
        void loadApplyList(DataTable dt);//控件三
        void loadPatientInfo(int patientId);//控件四
        void loadApplyInfo();//控件五
 
        //獲取控件數據
        void getApplyInfo();//控件五
        int getApplyId { get; }//當前手術申請
    }
  • 爲何控件二的數據獲取沒有封裝成接口?咱們把界面上的數據傳遞給控制器有兩種方式,一種是經過接口,另外一種是經過控制器方法的參數。
通常只有一個方法用到的數據我用參數,多個方法都用到確定用接口,還有就是參數太多了就用結構封裝起來。
接口中獲取數據能夠理解爲全局變量。
因此控件二就沒有用接口傳數據,而是準備看成參數傳。
  • 爲何接口會有getApplyId這個屬性?由於有些數據是隱藏在控件以外的,界面上無需展現但又邏輯上少不了的(分析出這些數據是難點)。
 
 
2)除了數據,還有一些界面行爲模式也能夠封裝成接口
public interface ISugeryApplyList:IBaseView
    {
        //加載控件數據
        void loadPatientList(DataTable dt);//控件一
        void loadApplyList(DataTable dt);//控件三
        void loadPatientInfo(int patientId);//控件四
        void loadApplyInfo();//控件五
 
        //獲取控件數據
        void getApplyInfo();//控件五
        int getApplyId { get; }//當前手術申請
 
        //界面行爲模式
        ApplyInfoControlEnabledStyle setEnabledStyle { set; }
    }
 
    public enum ApplyInfoControlEnabledStyle
    {
        默認,編輯
    }
  • setEnabledStyle屬性,默認下控件五爲只讀,編輯下控件五的數據能夠修改。界面打開「控件五」爲「默認」模式,當點擊「控件五」上的「新增」或「修改」變爲「編輯」模式,完後點擊「保存」或「取消」又回到「默認」模式。
  • 把界面行爲封裝起來確定會讓邏輯更清晰,另一個好處就是控制器也能夠經過接口操做界面行爲,好比:界面在編輯模式下,咱們修改了控件一的病人,全部數據將從新加載,同時控件五也必須回到「默認」模式,而這些操做均可以在控制器完成,無需在界面上編寫任何代碼。
 
3.SugeryApplyController的設計
習慣於把控制器的方法分爲,界面顯示前的「數據初始化」,操做界面時的」數據交互「
public class SugeryApplyController : BaseController<ISugeryApplyList>
    {
        //數據初始化
        public override void InitLoad()
        {
            DataTable patDt = null;//科室病人數據
            DataTable applyDt = null;//手術申請數據
 
            //從數據庫獲取數據
            //todo
 
            IfrmView.loadPatientList(patDt);
            IfrmView.loadApplyList(applyDt);
        }
        //查詢申請單列表
        public void SearchApplyList(int patientId, int state)
        {
            DataTable applyDt = null;//手術申請數據
            //todo
            IfrmView.loadApplyList(applyDt);
        }
        //獲取申請單詳細信息
        public void GetApplyInfo(int applyId)
        {
        }
        //刪除申請單
        public void DeleteApply(int applyId)
        {
        }
        //保存申請單
        public void SaveApply()
        {
        }
    }
」數據交互「方法設計必定要符合實際業務的操做,而不是直接是界面控件事件。
好比界面修改了控件一的病人、選擇了控件二的狀態都有控件各自的事件,可是事件內調用的都是控制器中得SearchApplyList方法。
其實界面上的操做都已經把實際業務給複雜化了,而控制器就是要保持與實際業務一致
 
4.界面調用控制器代碼
//雙擊申請網格
        private void dgvData_DoubleClick(object sender, EventArgs e)
        {
            int applyId = 0;//todo
            controller.GetApplyInfo(applyId);
        }
 
 
 
 efwplus開源框架官網:www.efwplus.cn
相關文章
相關標籤/搜索