三、利用EnterpriseFrameWork快速开发Winform系统(C/S)
EnterpriseFrameWork框架实例源代码下载: 实例下载
上一章讲解了开发Web系统的详细步骤,以书籍的管理作实例实现对书籍的增、删、改、查功能,本章接着上面的实例继续补充用Winform界面来实现此功能;
本文要点:
1.Winform版界面效果
2.Winform项目开发步骤
3.代码文件调用关系图
4.常见问题汇总
1.界面效果如下:

解决方案目录结构:

2.上图红色部分为这次新增加的文件,开发步骤:
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("", );
frmBook.loadbooks(dt);
}
//界面点击新增
public Book newbook()
{
return NewObject<Book>();
}
//保存
public void bookSave()
{
frmBook.currBook.save();
GetBooks();
}
}
}
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; }
}
}
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");
}
}
}
}
界面对象frmBookManager必须继承框架中的BaseForm对象和上面的IfrmBook接口,界面的控件是第三方控件NotNetBar,总的来说还是比较美观的;还有界面中用到了两个自定义控件,DataGrid和frmForm以后会详细介绍其功能;
InvokeController("bookSave");调用控制器中的bookSave方法,所有对控制器的调用都是通过InvokeController委托来实现;
还有一点就是注意,界面代码中的操作事件,“新增”、“保存”里面的代码都非常简单,只是向控制器发送一个消息;
比如:点击“保存”成功后,一般都会要重新加载网格的数据,这段代码无需写在保存之后,而是控制器实现了此功能,
这说明什么,说明界面上的一些数据联动都可以由控制器来控制,这要省了界面上多少代码,界面代码变得无比的干净明了,我想你肯定没有看到过如此简洁的代码,这就是我一直坚持的;
当一个非常复杂的界面,如果改造成这种方式,界面代码至少可以减少一半,1万行的代码最后几千行不到就可以搞定,而且大量减少了全局变量的存在;
这个方式真的只有使用过之后就能感觉到这种味道。。。
3.最后我们看下图,整理一下以上代码文件的调用关系

EnterpriseFrameWork框架实例源代码下载: 实例下载
三、利用EnterpriseFrameWork快速开发Winform系统(C/S)的更多相关文章
- 二、利用EnterpriseFrameWork快速开发Web系统(B/S)
EnterpriseFrameWork框架实例源代码下载: 实例下载 本章通过一个开发实例来讲解Web系统的开发经过,以及会碰到的一些问题.实例功能就是业务系统中最常见的增.删.改.查来演示,用一个界 ...
- 四、利用EnterpriseFrameWork快速开发基于WCF为中间件的三层结构系统
回<[开源]EnterpriseFrameWork框架系列文章索引> EnterpriseFrameWork框架实例源代码下载: 实例下载 本章内容与上一张<利用Enterprise ...
- 五、利用EnterpriseFrameWork快速开发基于WebServices的接口
回<[开源]EnterpriseFrameWork框架系列文章索引> EnterpriseFrameWork框架实例源代码下载: 实例下载 前面几章已完成EnterpriseFrameWo ...
- 如何快速开发Winform应用系统
在实际的业务中,往往还有很多需要使用Winform来开发应用系统的,如一些HIS.MIS.MES等系统,由于Winform开发出来的系统界面友好,响应快速,开发效率高等各方面原因,还有一些原因是独立的 ...
- 开发者如何利用工具快速开发出完美APP
文|移动互联网李建华 微信:ydhlwdyq 传统的个人开发者,要想开发出一个完美的APP要 经过以下几个过程:搭建开发环境,写代码,写统计系统,开发即将完成后,要购买服务器,然后把程序布置到服务器上 ...
- DSkin 的WebUI开发模式介绍,Html快速开发Winform的UI
新版WebUI开发模式采用MiniBlink内核,这个内核功能更完善,dll压缩之后才5M,而且提供开发者功能,内核还在更新中,而且是开源项目:https://github.com/weolar/mi ...
- UWP简单示例(三):快速开发2D游戏引擎
准备 IDE:Visual Studio 图形 API:Win2D MSDN 教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面你需要考虑图形.输入和网络 以及相对独立的 ...
- java 利用JAX-RS快速开发RESTful 服务
JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...
- java_java 利用JAX-RS快速开发RESTful 服务
JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...
随机推荐
- [19/04/28-星期日] GOF23_结构型模式(享元模式)
一.享元模式(FlyWeight,轻量级) [共享类与非共享类] /*** *FlyweightFactory享元工厂类: 创建并管理享元对象,享元池一般设计成键值对 */ package cn.sx ...
- iOS 二维码生成 记录一下
#import <CoreImage/CoreImage.h> @property (nonatomic, nonnull , strong) UIImageView *showImage ...
- CS 20_Overview of Tensorflow
tf.assign(A, new_number): 这个函数的功能主要是把new_number的值向前传递给了A run( fetches, feed_dict=None, options=None, ...
- background-position详解
一.background-position:left top; 背景图片的左上角和容器(container)的左上角对齐,超出的部分隐藏.等同于 background-position:0,0;也等同 ...
- web测试--测试点
转载自:51Testing 首先,查找需求说明.网站设计等相关文档,分析测试需求,制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:功能性测试:界面测试:性能测试:数据库测试:安全性测试:兼 ...
- 《Android应用测试与调试实战》读书笔记
一 本书概述 自动化测试篇:Android应用可以使用Java语言配合SDK,也可以使用HTML5技术,还可以用C/C++语言配合NDK技术编写,本书中涵盖了针对这三种技术编写的应用所采用的测试技术. ...
- linux 中安装mysql8.0
转载自:http://www.linuxidc.com/Linux/2016-11/137608.htm 可能有人会惊奇MySQL为何从5.x一下跳跃到了8.0.事实上,MySQL 5.x系列已经延续 ...
- haproxy原理理解
1.haproxy使用最需要注意的点: 1.1连接数: 前端maxconn默认值为2000,非常有必要将其增加几倍. 1.2超时时间 timeout connect 60s # haproxy和服务端 ...
- Spring+Hibernate+struts2+JPA 注解+跨域//完成手机端点击加载更多 下拉加载更多
一.使用IDEA新建一个maven项目(student) 1.1.0编写pom文件,添加项目所需要的包 <?xml version="1.0" encoding=" ...
- Java Web 程序猿的职业进阶之路
啥也不说了,都在图里了.希望能够给大家的职业规划一些提示,尤其是写了几年程序,却越来越迷茫的同学.