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)的更多相关文章

  1. 二、利用EnterpriseFrameWork快速开发Web系统(B/S)

    EnterpriseFrameWork框架实例源代码下载: 实例下载 本章通过一个开发实例来讲解Web系统的开发经过,以及会碰到的一些问题.实例功能就是业务系统中最常见的增.删.改.查来演示,用一个界 ...

  2. 四、利用EnterpriseFrameWork快速开发基于WCF为中间件的三层结构系统

    回<[开源]EnterpriseFrameWork框架系列文章索引> EnterpriseFrameWork框架实例源代码下载: 实例下载 本章内容与上一张<利用Enterprise ...

  3. 五、利用EnterpriseFrameWork快速开发基于WebServices的接口

    回<[开源]EnterpriseFrameWork框架系列文章索引> EnterpriseFrameWork框架实例源代码下载: 实例下载 前面几章已完成EnterpriseFrameWo ...

  4. 如何快速开发Winform应用系统

    在实际的业务中,往往还有很多需要使用Winform来开发应用系统的,如一些HIS.MIS.MES等系统,由于Winform开发出来的系统界面友好,响应快速,开发效率高等各方面原因,还有一些原因是独立的 ...

  5. 开发者如何利用工具快速开发出完美APP

    文|移动互联网李建华 微信:ydhlwdyq 传统的个人开发者,要想开发出一个完美的APP要 经过以下几个过程:搭建开发环境,写代码,写统计系统,开发即将完成后,要购买服务器,然后把程序布置到服务器上 ...

  6. DSkin 的WebUI开发模式介绍,Html快速开发Winform的UI

    新版WebUI开发模式采用MiniBlink内核,这个内核功能更完善,dll压缩之后才5M,而且提供开发者功能,内核还在更新中,而且是开源项目:https://github.com/weolar/mi ...

  7. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:Visual Studio 图形 API:Win2D MSDN 教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面你需要考虑图形.输入和网络 以及相对独立的 ...

  8. java 利用JAX-RS快速开发RESTful 服务

    JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...

  9. java_java 利用JAX-RS快速开发RESTful 服务

    JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...

随机推荐

  1. C#获取路径问题

    由于在写控制台的时候,不能获取到绝对的路径.(下面为学习内容) System.IO.Path类中有一些获取路径的方法,可以在控制台程序或者WinForm中根据相对路径来获取绝对路径 获取web物理路径 ...

  2. centos上nginx的安装

    安装步骤:   1.下载nginx,执行:wget http://nginx.org/download/nginx-1.10.2.tar.gz 2.解压,执行:tar vxzf nginx-1.10. ...

  3. 关于IntelliJ IDEA 文档无法编辑的解决办法

    问题:在调试的时候,光标无法聚焦到代码区,导致无法编辑代码.停止调试后,问题仍然存在,需要重启idea. 这个问题纠结了我一个上午,百狗一通,发现都是说要卸载vim插件啥的,但是我是没装过vim插件. ...

  4. js replace替换一段文本中所有的相同字符

    在html<textarea>标签中回车换行的代码是: \n,html编辑器的回车换行是:\r\n或是\n. 下图是存入后台的<textarea>的文本,需要在页面上显示出来, ...

  5. 安卓混合开发——原生Java和H5交互,保证你一看就懂!

    ** 在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的Jav ...

  6. Android-社会化分享

    2016年2月25日下午3点:现在无事,整理下这两天在网上搜集到的乱起八糟的东西和我的思路. 关于对社会化分享的了解,源于前天的一次apk打包操作.现在的情况是:开发编写功能代码提交SVN,我把代码d ...

  7. POJ 1182 食物链(经典带权并查集 向量思维模式 很重要)

    传送门: http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  8. jQuery 表单元素取值与赋值方法总结

    一.普通文本框的赋值与取值 1.1.1赋值 <h2>jQuery 表单元素取值与赋值方法总结</h2> <input type="text" clas ...

  9. 分布式架构学习-Consul集群配置

    简介 之前公司用的是Consul进行服务发现以及服务管理,自己一直以来只是用一下,但是没有具体的深入,觉得学习不可以这样,所以稍微研究了一下. 网上有很多关于Consul的介绍和对比,我这里也不献丑了 ...

  10. node.js中用户密码的加密

    crypro实现用户密码的加密 在实际的项目中,只要涉及到用户的信息,就是十分重要的.设想一下数据库里面存放的用户的密码是明文的形式,后果是有多严重.所以今天给大家分享一下express中怎样实现用户 ...