如何使用MVC编写Winform程序代码
2015-11-17 14:14
399 查看
efwplus开源框架官网:www.efwplus.cn
前提:业务分析设计已完成,界面设计完成
1.代码结构划分
1)界面层:FrmSugeryApplyList、ISugeryApplyList
2)控制器层:SugeryApplyController
3)模型:无(使用DataTable存储数据,无实体类)
2.ISugeryApplyList的设计
1)界面上控件加载数据和获取控件数据
(注:“控件五”内的控件因为是同时显示数据,或同时保存数据,所以我们当成一个控件处理,保持接口的简洁)
为什么控件二的数据获取没有封装成接口?我们把界面上的数据传递给控制器有两种方式,一种是通过接口,另一种是通过控制器方法的参数。
一般只有一个方法用到的数据我用参数,多个方法都用到肯定用接口,还有就是参数太多了就用结构封装起来。
接口中获取数据可以理解为全局变量。
所以控件二就没有用接口传数据,而是准备当作参数传。
为什么接口会有getApplyId这个属性?因为有些数据是隐藏在控件之外的,界面上无需展示但又逻辑上少不了的(分析出这些数据是难点)。
2)除了数据,还有一些界面行为模式也可以封装成接口
setEnabledStyle属性,默认下控件五为只读,编辑下控件五的数据可以修改。界面打开“控件五”为“默认”模式,当点击“控件五”上的“新增”或“修改”变为“编辑”模式,完后点击“保存”或“取消”又回到“默认”模式。
把界面行为封装起来肯定会让逻辑更清晰,另外一个好处就是控制器也可以通过接口操作界面行为,比如:界面在编辑模式下,我们修改了控件一的病人,所有数据将重新加载,同时控件五也必须回到“默认”模式,而这些操作都可以在控制器完成,无需在界面上编写任何代码。
3.SugeryApplyController的设计
习惯于把控制器的方法分为,界面显示前的“数据初始化”,操作界面时的”数据交互“
”数据交互“方法设计一定要符合实际业务的操作,而不是直接是界面控件事件。
比如界面修改了控件一的病人、选择了控件二的状态都有控件各自的事件,但是事件内调用的都是控制器中得SearchApplyList方法。
(其实界面上的操作都已经把实际业务给复杂化了,而控制器就是要保持与实际业务一致)
4.界面调用控制器代码
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 { 默认,编辑 } |
把界面行为封装起来肯定会让逻辑更清晰,另外一个好处就是控制器也可以通过接口操作界面行为,比如:界面在编辑模式下,我们修改了控件一的病人,所有数据将重新加载,同时控件五也必须回到“默认”模式,而这些操作都可以在控制器完成,无需在界面上编写任何代码。
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); } |
相关文章推荐
- VC++从txt文本中读取字符和数字
- C#关于DateTime得到的当前时间的格式和用法
- SpringMVC学习系列(1) 之 初识SpringMVC
- c语言static的作用
- input type = "range"滑块和output的使用
- C/C++代码命名和格式规范
- C#支付宝扫码支付代码完整版
- JAVA 实现 IMEI校验码算法
- php中strstr、strrchr、substr、stristr四个函数的区别总结
- 编程式使用IoC容器过程
- java中字符流的总结
- php实现简单的上传进度条
- OC-nsstring可变与不可变增删改查代码块
- eclipse的svn连接不上 request failed
- java数字图像处理基础使用imageio写图像文件示例(转载)
- 二维数组和指针(C语言)
- ASPxGridView自定义分页,点击标题排序
- C# 用Attribute实现AOP事务
- python py、pyc、pyo、pyd文件区别
- C++Template