三、利用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 .从 ...
随机推荐
- [运维笔记] Mysql单库备份脚本
工作中用到的Mysql单库备份Shell脚本,压缩备份,并在Crontab中添加计划任务,最多保存60天的备份 #!/bin/bash . /etc/profile USERNAME=zabbix P ...
- mvc數據遷移
在本节中,我们将使用Entity Framework Code First 数据迁移功能将模型类的改变应用到数据库中. 默 认情况下,当我们使用Entity Framework Code First ...
- 新闻cms管理系统(一) ---- thinkphp框架准备
1.thinkphp介绍 一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架 MVC:M数据层. V视图层 . C控制层 优点: (1)入手非常快 (2)thinkpjp提供核心内库.文件.函 ...
- iOS 屏幕录制功能
系统框架 #import <ReplayKit/ReplayKit.h> // 系统视频录制框架 声明协议 <RPPreviewViewControllerDelegate> ...
- C++设计一个不能被继承的类
1. 方法一 将构造函数和析构函数设置为私有函数,重新定义公有的静态函数来创建和释放类. #include "stdafx.h" #include <iostream> ...
- COSTA Cross-layer Optimization for Sketch-based笔记与感受
Main Idea 网络测量在sdn中十分重要,使用sketch的方法需要消耗大量硬件资源,占用其他重要功能的资源,无法容纳更多的测量任务.基于sketch的测量方法有两个特性:基于sketch的测量 ...
- ASP.NET Core 中的 WebSocket 支持(转自MSDN)
本文介绍 ASP.NET Core 中 WebSocket 的入门方法. WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道. 它用于从快速实时通信中获益的 ...
- Oracle DataGuard启动与关闭顺序
(一)Active DataGuard启动顺序(1)启动监听,先启从库再起主库 lsnrctl start (2)启动数据库,先启动备库在启主库 --先启备库 sql>startup nomou ...
- 【最新最全】为 iOS 和 Android 的真机和模拟器编译 Luajit 库
编译 Luajit 库,的确是一个挑战.因为官网的教程,在当前版本的 Xcode 和 NDK 环境中,已经不适用了.以前只是编译了适用于真机的 Luajit 库.最近在尝试编译模拟器 Luajit 库 ...
- BUAA OO 2019 第二单元作业总结
目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...