zoukankan      html  css  js  c++  java
  • 如何使用MVC编写Winform程序代码

    efwplus开源框架官网:www.efwplus.cn

    前提:业务分析设计已完成,界面设计完成

     
    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
  • 相关阅读:
    tornado中form表单验证详解
    关于tornado中session的总结
    Linux常用命令
    css3动画属性详解 与超酷例子
    keepalive高可用的健康检查
    keepalive的nginx防火墙问题
    安装配置hadoop
    tmux的简单快捷键
    部署使用elk
    k8s搭建部署
  • 原文地址:https://www.cnblogs.com/kakake/p/4971569.html
Copyright © 2011-2022 走看看