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

如何使用MVC编写Winform程序代码的更多相关文章

  1. 转 : 用Delphi编写安装程序

    http://www.okbase.net/doc/details/931  还没有亲自验证过,仅收藏 当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步 ...

  2. 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型

    今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...

  3. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

    建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...

  4. Log4.Net 在Winform、MVC、ashx程序里的使用,ashx程序里使用异步

    最近做一个双11活动的,是一套相关的H5页面.本来以为难度不大,但是做下来几天还是遇到些问题.就总结一下吧,还是有收获的. 1.在H5页面中,有一个遮罩层,还是挺有意思的.直接用div+css控制遮罩 ...

  5. 编写高质量代码改善C#程序的157个建议——建议117:使用SSL确保通信中的数据安全

    建议117:使用SSL确保通信中的数据安全 SSL(Secure Socket Layer)最初是由NetScape公司设计的,用于Web安全的网络协议.目前它已经广泛应用到各类网络传输通信中了.SS ...

  6. 编写高质量代码改善C#程序的157个建议——建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间

    建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间 在我们身边的世界中,对象是什么?对象就是事物,俗称“东西”.那么,什么东西算得上是一个对象呢?对象有属性.有行为.以动物为例,比 ...

  7. 编写高质量代码改善C#程序的157个建议——建议85:Task中的异常处理

    建议85:Task中的异常处理 在任何时候,异常处理都是非常重要的一个环节.多线程与并行编程中尤其是这样.如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出.处理那些不是主线程(如果是窗体程序 ...

  8. 编写高质量代码改善C#程序的157个建议——建议79:使用ThreadPool或BackgroundWorker代替Thread

    建议79:使用ThreadPool或BackgroundWorker代替Thread 使用线程能极大地提升用户体验度,但是作为开发者应该注意到,线程的开销是很大的. 线程的空间开销来自: 1)线程内核 ...

  9. 编写高质量代码改善C#程序的157个建议——建议73:避免锁定不恰当的同步对象

    建议73:避免锁定不恰当的同步对象 在C#中,让线程同步的另一种编码方式就是使用线程锁.线程锁的原理,就是锁住一个资源,使得应用程序在此刻只有一个线程访问该资源.通俗地讲,就是让多线程变成单线程.在C ...

随机推荐

  1. Spring基本概念

    spring优点: 1降低组件间耦合度,实现软件各层之间的解耦. 2可以使用容器提供的各种服务.如,事务管理服务,消息服务等等. 当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需处理复 ...

  2. Ubuntu SVN客户端安装

    查看系统版本: uname -a (Linux查看版本当前操作系统内核信息) cat /proc/version (Linux查看当前操作系统版本信息) 1.首先需要安装Ubuntu SVN.Ubun ...

  3. C语言实现冒泡排序-整数排序

    我一直觉得排序算法挺重要的,但是却没有深入的去理解它: 没有深入理解就无法用代码将它实现: 在腾讯的在线模拟考试中就有一题问到冒泡排序: 我几乎是傻眼了!我知道这样的问题是最基础的: 无论过去怎样现在 ...

  4. Couldn't create temporary file to work with

    Ubuntu中当你编译安装软件的时候可能会出现Couldn't create temporary file to work with,原因可能是: 1.权限问题  2.根目录下没有tmp文件夹 解决办 ...

  5. android: 播放音频

    在 Android 中播放音频文件一般都是使用 MediaPlayer 类来实现的,它对多种格式的音 频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单.下表列出了 MediaPlay ...

  6. 使用Nginx负载均衡搭建高性能.NETweb应用程序二

    在文章<使用Nginx负载均衡搭建高性能.NETweb应用程序一>中,让我们对Nginx有了一个初步认识,下面我们将在windows平台下面使用Nginx演示集群部署我们的web应用. 一 ...

  7. NR_OPEN 与 NR_FILE 的区别

    NR_OPEN 与 NR_FILE 的区别 阅读0.11版的内核源码时,在linux-0.11/fs/pipe.c中,函数sys_pipe()里面出现了2个宏定义,NR_OPEN 与 NR_FILE. ...

  8. [1].jekyll扫盲

    一.jekyll是什么? jekyll是一款免费的blog生成工具,将纯文本(plain text)转换为静态网站或博客. Jekyll是一个使用Ruby编写的静态站点生成工具,使用Liquid模板渲 ...

  9. IIS下使用appcmd批量搭建网站

    使用 cmd 运行如下命令 > %windir%\system32\inetsrv\appcmd list site /config /xml > d:\sites.xml 修改 d 盘 ...

  10. (转)Shadow Map & Shadow Volume

    转自:http://blog.csdn.net/hippig/article/details/7858574 shadow volume 这个术语几乎是随着 DOOM3 的发布而成为FPS 玩家和图形 ...