95992828九五至尊2

Winform开发框架之插件化应用框架落成,Winform开发框架的重点特色统计

二月 8th, 2019  |  882828九五至尊手机版

支撑插件化应用的支付框架能给程序带来持续生命力,也是当下广大系统、程序追求的主要取向之一,插件化的模块,在依照一定的接口标准的基础上,可以完成快速集成,也就是所谓的热插拔操作,可以极其对已经支付好系统开展伸张,而且不会潜移默化已有的职能,不在要求的模块,通过改动配置移除即可。我的Winform开发框架一向以来,来源于多年的门类积累以及客户的报告,已经拥有了过多很好的特点以及相关的模块组成,为了更好拥抱变化,提升基于Winform开发框架基础上开发新系统的频率,以及为框架融入愈来愈多好的风味,故此把自身的Winform开发框架在原先的底蕴上进展扩展,完结基于插件化应用的框架特性。

从事Winform开发框架的切磋和松手,也做了有多少个年头了,从早期的门类雏形到当下各样主要特色的投入完善,是通过了广大门类的下结论概括和升华,有些则是基于客户须要或者利用前景的须求举办的周详,整个Winform开发框架具有很好的通用性和借鉴性,本文从该Winform开发框架进行包涵统计,力求把各类首要的表征开展局地详尽的印证,使大家探听任何Winform开发框架的长相和特点。

为了引入插件化的利用框架特点,我在上一篇小说《Winform开发框架之权能管理种类的改正》已经对自己的通用权限管理种类进行了立异,其中扩充了菜单管理模块就是为着做插件化做准备的,大家透过权限管理种类安插好菜单的有关音信,然后在使用框架中动态加载菜单功效即可兑现。那几个菜单模块,是用来配置基于Web开发框架或者Winform开发框架、WCF开发框架的菜系,通过先行的布署,框架程序的动态加载解析,就能兑现插件模块的热插拔作用了。实际插件化框架的菜单配置界面效果如下所示。

Winform开发框架总体性概括有:扶助插件化应用开发,可以动态配置及加载开发的插件;菜单协助动态配置,可依照用户权限进行动态控制展现;集成各样独立开发好的模块,如权限管理连串、字典管理模块等,自动更新模块等,达成系统的权柄控制、字典管理、软件协理远程自动更新等成效;可重复使用的种类基础模块,Winform分页控件和.NET开发公用类库等;整个框架通过与代码生成工具Database2Sharp举行合营,可以一键转变全部性框架代码,Winform系统界面代码,开发更迅捷。

882828九五至尊手机版 1

总体Winform开发框架,提供了广大广泛业务系统提供的法力,包涵Excel数据导入导出,能飞快导入自定义模块的Excel数据,快捷导出列表数据;自定义Excel自定义模板报表的变迁,生成各样复杂的Excel报表;强大通用的计算图表模块,数据计算更便民;基于多数据的数量查询模块和通用高级查询模块,查询数据更有利于;框架提供根据种种数据库(Sqlserver/Oracle/Mysql/Sqlite/Access)的结合,可以手动配置数据库类型,通用模块内置支持各类数据库切换;框架提供了莫大封装的数据访问基类,开发代码更少更迅捷;框架界面基类也展开联合封装,使用更方便,效果更统一;框架提供基础性的支撑,包含合并登陆、闪屏、托盘作用,以及为插件模块提供登陆用户音讯和系统新闻。

最终在Winform开发框架的主次中,落成基于插件化的行使,如下所示。

Winform开发框架的第一功能概览如下图所示。

882828九五至尊手机版 2

882828九五至尊手机版 3

先来探望自己改造Winform开发框架,最后形成的框架界面效果,然后在各样进行介绍,整个开发框架的落到实处进度。

1、襄助插件化应用开发,能够动态配置及加载开发的插件

框架完结基于插件化的行使,如下所示。

882828九五至尊手机版 4882828九五至尊手机版 5

支撑插件化应用的开销框架能给程序带来持续生命力,也是现阶段众多种类、程序追求的根本趋势之一,插件化的模块,在绳趋尺步一定的接口标准的根基上,可以实现快捷集成,也就是所谓的热插拔操作,能够无限对曾经付出好系统举办增添,而且不会潜移默化已有的效益,不再须求的模块,通过修改配置移除即可。

插件化应用也是现阶段框架和连串开发的主流趋势,从开销公司的产品管理角度来看,第一得以把控好已有些框架产品,第二足以把里面的人口分配到不一致的事务模块中,让他们按照一定的接口即可火速支付,从而加强协会对作业模块的横向切割和连忙支付的成效,更好、统一、高效到位公司化应用框架的搭建和运用。

882828九五至尊手机版 6

2、菜单扶助动态配置,可按照用户权限举办动态控制显示

貌似Winform程序中,菜单都是直接写在主程序中的,这样对于修改和保安菜单的有关新闻,可能有所不便,而且对于插件化应用,新增菜单是广阔的工作,那样就必要对菜单进行动态配置管理了,通过后台菜单的布局和权杖的指定,可以已毕菜单的动态加载和权力验证。

据此菜单也是权力分配的一有的,为了有效管理菜单资源,大家把菜单放到权限管理连串中开展管理控制。

882828九五至尊手机版 7

设定好菜单的图标和Winform窗体类型,就能在Winform框架中动态营造菜单消息了。菜单的图片放置在系统的相对目录下即可。

882828九五至尊手机版 8

882828九五至尊手机版 9

 

1、框架的门类工程规划

为了减小框架全部的纷纭以及提升重用,对插件化的运用框架的门类工程进展了分割,包罗“框架基础界面模块”、“插件应用框架启动模块”、仓库管理体系模块业务逻辑、仓库管理连串模块窗体界面等多少个部分。前面多个部分是插件化框架的核心,可以认为是不需要转变的模块,提供所有插件应用动态创设以及利用的框架支撑;后边多少个是切实的主业务模块,那里以WInform开发框架中的仓库管理连串作为主业务模块,它本身也是插件应用之一,具体的品种工程协会以及表达如下所示。

882828九五至尊手机版 10

项目名称 项目说明
WHC.Framework.BaseUIDx  框架基础界面模块,定义窗体界面基类、通用Excel导入模块、通用高级查询模块等
WHC.Framework.StarterDx  插件应用框架启动模块,集成权限登录、动态菜单创建、插件应用动态加载、基础框架功能等
WHC.WareHouseMis  仓库管理系统模块的业务逻辑
WHC.Framework.WareHouseDx   仓库管理系统模块的窗体界面

从位置的报表表达中,大家得以阅览“WHC.Framework.StarterDx”项目工程,是“插件应用框架启动模块”,它基本上只和权杖管理种类模块有关联关系,因为权限系统是框架底层支撑的模块,包含用户登录、菜单管理、权限决定等都须求从权力管理系列中获取数据,具体的基本点工作功效如下所示。

 882828九五至尊手机版 11

 

3、集成各个独立开发好的模块,如权限管理种类、字典管理模块等,自动更新模块等

2、框架的菜系动态加载

 本文第一张图纸里面,介绍了菜单的定义音信,其中囊括了图标的安顿,那么些图片为了方便管理,以及插件必要动态增加菜单图标,我把它放置在了程序目录的相对路径下边,如下所示,动态创造菜单的时候,从指定的路子去赢得图标并加载即可。

882828九五至尊手机版 12

动态加载菜单是指在插件化应用框架启动,用户登录后进入主界面后,在主界面中动态创制相应的菜谱(菜单在权力管理种类中举行安插管理),如下代码所示。

882828九五至尊手机版 13

里面是RibbonPageHelper为了方便动态制造菜单而创办的协理类,部分代码如下所示。

    /// <summary>
    /// 动态创建RibbonPage和其下面的按钮项目辅助类
    /// </summary>
    public class RibbonPageHelper
    {
        private RibbonControl control;
        public MainForm mainForm;

        public RibbonPageHelper(MainForm mainForm, ref RibbonControl control)
        {
            this.mainForm = mainForm;
            this.control = control;
        }

        public void AddPages()
        {
            //约定菜单共有3级,第一级为大的类别,第二级为小模块分组,第三级为具体的菜单
            List<MenuNodeInfo> menuList = WHC.Security.BLL.BLLFactory<SysMenu>.Instance.GetTree(Portal.gc.SystemType);
            if (menuList.Count == 0) return;

            int i = 0;
            foreach(MenuNodeInfo firstInfo in menuList)
            {
                //如果没有菜单的权限,则跳过
                if (!Portal.gc.HasFunction(firstInfo.FunctionId)) continue;

                //添加页面(一级菜单)
                RibbonPage page = new DevExpress.XtraBars.Ribbon.RibbonPage();
                page.Text = firstInfo.Name;
                page.Name = firstInfo.ID;
                this.control.Pages.Insert(i++, page);

                if(firstInfo.Children.Count == 0) continue;
                foreach(MenuNodeInfo secondInfo in firstInfo.Children)
                {
                    //如果没有菜单的权限,则跳过
                    if (!Portal.gc.HasFunction(secondInfo.FunctionId)) continue;

                    //添加RibbonPageGroup(二级菜单)
                    RibbonPageGroup group = new RibbonPageGroup();
                    group.Text = secondInfo.Name;
                    group.Name = secondInfo.ID;
                    page.Groups.Add(group);                

                    if(secondInfo.Children.Count == 0) continue;
                    foreach (MenuNodeInfo thirdInfo in secondInfo.Children)
                    {
                        //如果没有菜单的权限,则跳过
                        if (!Portal.gc.HasFunction(thirdInfo.FunctionId)) continue;

                        //添加功能按钮(三级菜单)
                        BarButtonItem button = new BarButtonItem();
                        button.PaintStyle = BarItemPaintStyle.CaptionGlyph;
                        button.LargeGlyph = LoadIcon(thirdInfo.Icon);
                        button.Glyph = LoadIcon(thirdInfo.Icon);

                        button.Name = thirdInfo.ID;
                        button.Caption = thirdInfo.Name;
..................
                        group.ItemLinks.Add(button);
                    }
                }
            }
        }
...............

菜单为了方便管理,约定分为3级菜单,多个层级的菜系示意图如下所示。

882828九五至尊手机版 14

开行顶部的选项卡级别为率先级,下边的Ribbon分组为第二级,具体的职能菜单(或者按钮)为第三级,以上就是经过菜单数据动态创制的菜单界面图。

 3.1 权限管理模块

权力的分红和管理,基本上是每个事情系统需求考虑的事物,而这几个常用的东西,在任何Winform开发框架中,把它作为一个独门的模块,既有益维护管理,也留有接口很简单举办合并,那样可以在档次中多次开展利用。

权力系统须要考虑的系列用户、社团机构、角色、权限定义及分红、菜单管理、用户登录日志等生死相依音信。对于每新增一个系统,大家只须求在权力管理种类中扩充一个系统类型定义,以及相关的机能、菜单数据即可,万分方便管理。

882828九五至尊手机版 15

3、框架的用户新闻和权力控制

基础框架须求观念的报到举行认证,登录成功后,把用户关联的有所的权能下载到本地,然后由系统逻辑统一判断即可。

插件应用框架连串的登录代码和一般性的反差不大,登录后把有关消息囤积在框架变量中,如下所示。

882828九五至尊手机版 16

        private void btLogin_Click(object sender, EventArgs e)
        {
.................

            try
            {
                string ip = NetworkUtil.GetLocalIP();
                string macAddr = HardwareInfoHelper.GetMacAddress();
                string loginName = this.cmbzhanhao.Text.Trim();
                string identity = WHC.Security.BLL.BLLFactory<WHC.Security.BLL.User>.Instance.VerifyUser(loginName, this.tbPass.Text, Portal.gc.SystemType, ip, macAddr);
                if (!string.IsNullOrEmpty(identity))
                {
                    UserInfo info = WHC.Security.BLL.BLLFactory<WHC.Security.BLL.User>.Instance.GetUserByName(loginName);
                    if (info != null)
                    {
                        #region 获取用户的功能列表

                        List<FunctionInfo> list = WHC.Security.BLL.BLLFactory<WHC.Security.BLL.Function>.Instance.GetFunctionsByUser(info.ID, Portal.gc.SystemType);
                        if (list != null && list.Count > 0)
                        {
                            foreach (FunctionInfo functionInfo in list)
                            {
                                if (!Portal.gc.FunctionDict.ContainsKey(functionInfo.ControlID))
                                {
                                    Portal.gc.FunctionDict.Add(functionInfo.ControlID, functionInfo.ControlID);
                                }
                            }
                        }

                        #endregion

                        bLogin = true;
                        Portal.gc.UserInfo = info;
                        Portal.gc.LoginUserInfo = ConvertToLoginUser(info);

                        this.DialogResult = DialogResult.OK;
                    }
                }
                else
                {
                    MessageDxUtil.ShowTips("用户帐号密码不正确");
                    this.tbPass.Text = ""; //设置密码为空
                }
            }
            catch (Exception err)
            {
                MessageDxUtil.ShowError(err.Message);
            }
        }

为了使框架记录的权位音讯、用户数据、以及系统的一对配备音讯可见传递到每个插件应用的窗体中,设计了一个插件应用界面须要贯彻的接口,放在了BaseUI项目工程中。

namespace WHC.Framework.BaseUI
{
    /// <summary>
    /// 父窗体实现的权限控制接口
    /// </summary>
    public interface IFunction
    {
        /// <summary>
        /// 初始化权限控制信息
        /// </summary>
        void InitFunction(LoginUserInfo userInfo, Dictionary<string, string> functionDict);

        /// <summary>
        /// 是否具有访问指定控制ID的权限
        /// </summary>
        /// <param name="controlId">功能控制ID</param>
        /// <returns></returns>
        bool HasFunction(string controlId);

        /// <summary>
        /// 登陆用户基础信息
        /// </summary>
        LoginUserInfo LoginUserInfo { get; set; }

        /// <summary>
        /// 登录用户具有的功能字典集合
        /// </summary>
        Dictionary<string, string> FunctionDict { get; set; }

        /// <summary>
        /// 应用程序基础信息
        /// </summary>
        AppInfo AppInfo { get; set; }

    }
}

然后在BaseUI的品种中,界面基类BaseForm完毕那些接口。

namespace WHC.Framework.BaseUI
{
    public partial class BaseForm : DevExpress.XtraEditors.XtraForm, IFunction
    {

        public BaseForm()
        {
            InitializeComponent();
        }

...................

末尾,就是大家怎样传递用户音信以及权限新闻到窗体本身,传递到窗体作为其自身的变量后,就足以很方便使用这么些主要的新闻了。

在我们动态加载插件应用的后,大家会创制对应的Form对象,然后转换为IFunction接口,赋予该接口相关的变量属性即可达成用户音讯及权限新闻的传递,如下代码所示。

               Form tableForm = (Form)Activator.CreateInstance(formType);

                //如果窗体集成了IFunction接口(第一次创建需要设置)
                IFunction function = tableForm as IFunction;
                if (function != null)
                {
                    //初始化权限控制信息
                    function.InitFunction(Portal.gc.LoginUserInfo, Portal.gc.FunctionDict);

                    //记录程序的相关信息
                    function.AppInfo = new AppInfo(Portal.gc.AppUnit, Portal.gc.AppName, Portal.gc.AppWholeName, Portal.gc.SystemType);
                }

3.2 字典管理模块

除此以外,除了权力的军事管制,字典管理也是正常工作模块的一个总要作用,由此字典管理模块在Winform开发框架中,也是一个独立的模块进行支付管理,在利用的时候进行集成即可。

字典的分类可以按多级举办分类管理,可以拖拉进入新的分类,非凡便利。

882828九五至尊手机版 17

 4、插件应用的动态加载

上边我们说到,只若是兑现基于Form的,大家都可以动态创立格局调用彰显插件的界面出来,而一旦界面完结了IFucntion的权柄决定接口,那么我们就可见传递给它响应的数据,完成越发完美的决定成效。

在率先张有关权限系统的菜系管理图片中,大家看看了有个Winform的窗体类型的字段,里面就是用来动态构造插件的布局消息,大家根本是用来社团插件的窗体,并传递给它相关数据即可,下图是菜单管理内部的
“Winform窗体类型” 消息的具体内容。

882828九五至尊手机版 18

但我们完毕菜单的动态创设后,菜单按钮的响应事件就是接触动态加载插件的风浪。

大家添加菜单的时候,对它的响应事件也做了拍卖,具体代码如下所示。

                        //添加功能按钮(三级菜单)
                        BarButtonItem button = new BarButtonItem();
                        .................
                        button.Caption = thirdInfo.Name;
                        button.Tag = thirdInfo.WinformType;
                        button.ItemClick += (sender, e) =>
                        {
                            if (button.Tag != null && !string.IsNullOrEmpty(button.Tag.ToString()))
                            {
                                LoadPlugInForm(button.Tag.ToString());
                            }
                            else
                            {
                                MessageDxUtil.ShowTips(button.Caption);
                            }
                        };
                        group.ItemLinks.Add(button);

单击事件的响应处理就是动态营造插件应用的风浪,其中就是基于“Winform窗体类型”的数量开展辨析的。

                string dllFullPath = Path.Combine(Application.StartupPath, filePath);
                Assembly tempAssembly = System.Reflection.Assembly.LoadFrom(dllFullPath);
                if (tempAssembly != null)
                {
                    Type objType = tempAssembly.GetType(type);
                    if (objType != null)
                    {
                        LoadMdiForm(this.mainForm, objType, isShowDialog);    
                    }
                }

透过动态制造菜单模块,动态加载插件应用,以及权限控制等管理,我们就能切断框架本身和插件应用模块之间的耦合性关联,所有继续开发仍然外人付出的事务模块,都得以很有益的经过权限管理系列布置数据、自动更新模块更新程序行使的方法,把一个快速、易于扩充、动态管理的系统运用弄得丰裕多彩,绘身绘色。

依据插件化应用框架的Winform开发框架改造,使得今后支付工作系统,只是依据一定的接口协议,开发插件应用即可,全体性的框架本身可以有专门的人口展开维护,升高社团对作业模块的横向切割和飞跃支付的频率,更好、统一、高效到位公司化应用框架的搭建和运用。

上边的图形是在此之前Winform开发框架的有关职能点集合,加上近年来框架的“援救插件化框架应用,能高效支付插件、接济动态扩充”的特点,就显示越来越助长周到了。

882828九五至尊手机版 19

3.3 自动更新模块

貌似景观下,为了有效管理应用程序的发表及更新,大家需求软件帮忙远程自动更新作用;在Winform开发框架中再引入一个电动升级更新的通用模块,这么些活动升级的通用模块除了有着一般的效率外,可以由此安顿程序标题、升级路线方法等办法,完结通用化的提拔操作,其余急需升级的程序,拿过来就可以动用,经过项目标结合及优化,已经拥有较好的使用前景了。

本通用自动更新模块具有下边多少个性状:

1)程序标题可安插,更新路径可安顿,适用于种种要求更新的系列结合。

2)帮助文件复制或者对减弱包进行解压,适合越多琐碎程序集的一体化升高。

3)匡助文件更新后自行启动,或者带参数的起步形式。

882828九五至尊手机版 20

4、可重复使用的系统基础模块,Winform分页控件和.NET开发公用类库等

4.1 Winform分页控件

为了增强数据的获取及展现功效,一般景况下,我们都急需对数码开展分页获取和出示,在网络化环境,那种措施获取数据更加紧要,在Winform里面,没有现成的分页控件可以利用,因而出于这几个考虑,把数量体现、数据导出、数据打印等居多职能集成一起,尤其方便使用。分页控件完美协理列表数据的分页,可以调动突显列及顺序,是还是不是出示复选框,字段别名,奇偶列的颜色变化,列新闻提示和数量复制等等众多实用细致的效果的。

列表的数额绑定及浮现代码,通过代码生成工具,能够一键变动所需的界面代码,开发成效飞一般的升级换代。

882828九五至尊手机版 21

882828九五至尊手机版 22  

4.2 .NET公用类库

俗话说,一个无名英雄十个帮,兵多将广等都证实一个道理,有越来越多的资源,更丰硕的积聚,都是助你走向成功,走向极端的拉引力。就大家开发者而言,其中技术的积攒、资源的积攒,就是类似一个个好汉、一根根好柴,是大家可以举行快捷开发的管教和牵动力。

那么些类库是自家从事多年软件开发,渐渐提炼和发现的有的闪光点或者好一些,有些是收到外人的不错的事物,有些是自己逐步提炼的精华,以前,在互连网上看出局地开源的花色,总会先看看其是或不是有包装卓绝、作用独立的赞助类库,发现好的赞助类库,总是乐呵呵若狂好一阵子,学习中逐年积累,研商中逐年提炼,多年过后,略有小成,终为今天所介绍的扶助类库集合。这几个接济类库平常也并不是负有的都会用得上,但是有些常用的,大致各种项目就会用到,类库涉及面相当广,可以为大家开发节省成千上万时间,并且大家也得以按照自己的急需展开扩大完善,形成和谐的类库集合。

博客公用类库在线帮衬文档列表:

 蓄势待发,丰盛的公用类库积累,助你快捷开展系统开发(1)—-开篇统计
 蓄势待发,充分的公用类库积累,助你快捷开展系统开发(2)—-常用操作
 蓄势待发,丰富的公用类库积累,助你神速开展系统开发(3)—-数据库相关操作
 蓄势待发,丰硕的公用类库积累,助你快捷开展系统开发(4)—-CSV、Excel、INI文件、独立存储等文件有关
 厚积薄发,丰硕的公用类库积累,助你快捷开展系统开发(5)—-热键、三二十四线程、窗体动画冻结等窗体操作
 蓄势待发,充足的公用类库积累,助你火速开展系统开发(6)—-全屏截图、图标获取、图片打印、页面预览截屏、图片复杂操作等
 蓄势待发,充足的公用类库积累,助你火速开展系统开发(7)—–声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等配备相关
 蓄势待发,丰裕的公用类库积累,助你疾速开展系统开发(8)—-非对称加密、BASE64加密、MD5等常用加密处理 
 厚积薄发,充分的公用类库积累,助你飞快开展系统开发(9)—-各样常用帮衬类
 蓄势待发,丰裕的公用类库积累,助你快捷开展系统开发(10)—种种线程同步的集合类
 蓄势待发,丰裕的公用类库积累,助你飞速开展系统开发(11)—各样线程相关操作类
 蓄势待发,丰盛的公用类库积累,助你快捷开展系统开发(12)—
网络有关操作扶助类

5、代码生成工具Database2Sharp的结合

万事框架通过与代码生成工具Database2Sharp举办合作,能够一键变迁全部性框架代码,Winform系统界面代码,开发更火速。

882828九五至尊手机版 23

在全部Winform开发框架中,Database2Sharp生成出来的代码体现了那么些健全的整合性,可以无缝接入开发的框架连串中,无论是常规的事务逻辑和多少访问层代码,以及一些列表、编辑界面的Winform界面代码,都能高效转移,稍作调整即可知足工作模块的内需。

Database2Sharp是一个简短点击几回鼠标就能形成一周代码量的代码生成工具,功用惊人、友好保养,真正的开支好伴侣。提供了对SqlServer
2000、SqlServer
2005、Oracle、Mysql、Access、SQLite的接济;可以转变各类架构代码、Winform界面代码,并且和Winform开发框架周到结合,浮现出更高的开发功能。

882828九五至尊手机版 24

6、通用的Excel数据导入导出,能很快导入自定义模块的Excel数据,神速导出列表数据

鉴于一般的事连串统,平常性的多寡导入时很正规的政工需要,因为毕竟使用Excel来操作数据也很有利,或者出于系统里面的数据交流要求,大家要求提供一个输入给客户导入所急需的多少。不过导入数据的时候,分裂的事体数据对应分裂的Excel文件,很难形成统一,但万一是每个业务模型,都成立一个两样的导入界面来操作Excel数据,又会认为说不定某种程度上重复劳动,增添花费及保证资金。

那么有无一种介于两者之间的不二法门,来贯彻作用的最优化,并且可以联合使用好一个导入的界面呢,在支付世界,只要能想到的,一般也能形成,由于工作的内需,在自己的Winform开发框架中引入了一个通用的多寡导入模块,来落到实处这么些既是统一,又是生成的工作要求。Winform框架提供的个通用的Excel数据导入导出机制,通过代码生成工具Database2Sharp自动生成的代码,就含有了什么运用那个通用导入模块的连带代码以及该模块的导出数据的代码,大家要做的就是在系统运作起来,导出一些数量作为某个模块的Excel模板即可。上面的效益按钮就是利用代码生成工具自动生成的界面包括的按钮。

882828九五至尊手机版 25

通用数据导入作用,包涵上边多少个方面的始末。

882828九五至尊手机版 26

上边就是一个实际变化的效用模块,其导入界面的运作效果。

882828九五至尊手机版 27

在最底的状态栏里面,但我们保留数据的时候,会调用后台线程进行数量保存,并显示数据导入的快慢情状,由于是选用后台线程处理,不会卡住当前的界面,在多文档的Winform开发框架界面中,可以切换来其余作业界面举行其余处理,不影响全体界面操作。

7、自定义Excel自定义模板报表的生成,生成各类繁复的Excel报表

不少景况下,我们需求扭转比较正式的Excel模块,由此自定义模板报表就是一种很好的方案,Winform开发框架提供了各种自定义Excel报表的变更。

882828九五至尊手机版 28

利用普通的二维表,就算能满足半数以上的情景,不过在一般的作业中,自定义模板的报表根据贴近实际,符合客户的要求,尽管自定义模板的报表,比经常的二维报表复杂一些,不过使用Apose.Cell控件,并在预设模板中预设变量,可以生成很复杂的表格。

切实的自定义模板报表可以参考下我计算的两篇小说。

选取Aspose.Cell控件落成Excel高难度报表的更动(一)

采纳Aspose.Cell控件达成Excel高难度报表的变迁(二)

比如生成一个规范的出库单,那几个表单有表头音讯,列表数据信息,并非一个平淡无奇的二维表,而且那种格式比较稳定,因而很适合自定义模块报表的转变操作。

882828九五至尊手机版 29  

 其余安插模板如下所示:

 

882828九五至尊手机版 30 

实际上变化的表格如下所示:

882828九五至尊手机版 31

8、强大通用的计算图表模块,数据计算更利于

统计图表在很多门类都可能用到,集成到框架中,更有利于我们对一部分图纸项目的规划掌握以及功效的选用。在形似的思想意识的框架中,可以使用ZedGraph开源控件或者微软自带的MSChart举行图片设计,DevExpress控件套件有温馨的图纸控件,那里最主要介绍基于DevExpress控件的图形控件举办图片设计。

8.1 普通统计图表

此间指的平常计算图表,只是对表某一品种开展单一的计算,可以从饼状图、柱状图的图形中显示那个品种分级所占的比重和数值,在Winform框架中的普通统计图表模块中,包罗了饼状图、柱状图和数据表格,那样更有利对数码举行完善的辨析和查看。整个模块是可以引用的,指定字段属性就足以对比客观的突显出分化分类项目标计算功效了,具体效果图如下所示。

882828九五至尊手机版 32

地点的计算图表中,还富含了上边三个成效模块,如下所示。

882828九五至尊手机版 33

882828九五至尊手机版 34

8.2 动态项目总括图表

有时,对于表里面的数码,可能要对两样类型的情节开展动态的总计,以确定他们各自的比重景况,那么那些动态项目标统计图表就比较适当了,例如,对于患儿资料的保管,可能需求计算各样病种所占的比例或者种种工作类型的犯病率,这几个不太确定的统计项目,就须求一个可以接济动态项目的统计图表举办支撑,对于本Winform框架,为了较好表现那些项目报表的含义,我选拔了对备件类型所占的比例举行一个总计分析,得到下边的总结图表,如下所示。

882828九五至尊手机版 35

地点的图样统计,除了可以根据部分尺度举办限制查询范围外,还足以对一部分预设的总括字段举办动态选拔,然后按照字段里面的各类内容(总括项目)进行计算,这样就可以比较有效的计算出种种别型的数值和比重了。

8.3 多重坐标比较统计图表模块

在Winform框架之中,可以对某一年各月份的出入库数量举办一个剖析,获得上面的统计图。

882828九五至尊手机版 36

上述数量不多,显示可能不太窘迫,上边我付出我另一个软件系统的界面,其中对患儿的出入院记录进行一个统计相比分析,计算报表如下所示。

882828九五至尊手机版 37

9、基于多数据库的数量查询模块和通用高级查询模块,查询数据更有益于

在自身的Winform开发框架中,使用了一个询问协理类SearchCondition来完结查询条件的收获和中转,那么些扶助类内置了对五种数据库条件的辨析处理,因而可以很好转变所须求的多少查询条件,正确高效获取所需的多寡举办显示。

        /// <summary>
        /// 根据查询条件构造查询语句
        /// </summary> 
        private string GetConditionSql()
        {
            //如果存在高级查询对象信息,则使用高级查询条件,否则使用主表条件查询
            SearchCondition condition = advanceCondition;
            if (condition == null)
            {
                condition = new SearchCondition();
                condition.AddCondition("ItemName", this.txtName.Text, SqlOperator.Like)
                    .AddCondition("ItemBigType", this.txtBigType.Text, SqlOperator.Like)
                    .AddCondition("ItemType", this.txtItemType.Text, SqlOperator.Like)
                    .AddCondition("Specification", this.cmbSpecNumber.Text, SqlOperator.Like)
                    .AddCondition("MapNo", this.txtMapNo.Text, SqlOperator.Like)
                    .AddCondition("Material", this.txtMaterial.Text, SqlOperator.Like)
                    .AddCondition("Source", this.txtSource.Text, SqlOperator.Like)
                    .AddCondition("Note", this.txtNote.Text, SqlOperator.Like)
                    .AddCondition("Manufacture", this.txtManufacture.Text, SqlOperator.Like)
                    .AddCondition("ItemNo", this.txtItemNo.Text, SqlOperator.LikeStartAt)
                    .AddCondition("WareHouse", this.txtWareHouse.Text, SqlOperator.Like)
                    .AddCondition("Dept", this.txtDept.Text, SqlOperator.Like)
                    .AddCondition("UsagePos", this.txtUsagePos.Text, SqlOperator.Like)
                    .AddCondition("StoragePos", this.txtStoragePos.Text, SqlOperator.Like);
            }
            string where = condition.BuildConditionSql().Replace("Where", "");
            return where;
        }

    /// <summary>
    /// Sql的查询符号
    /// </summary>
    public enum SqlOperator
    {
        [Description("Like 模糊查询")]
        Like,

        [Description("Not LiKE 模糊查询")]
        NotLike,

        [Description("Like 开始匹配模糊查询,如Like 'ABC%'")]
        LikeStartAt,

        [Description("= 等于号")]
        Equal,

        [Description("<> (≠) 不等于号")]
        NotEqual,

        /// <summary>
        /// > 大于号
        /// </summary>
        [Description("> 大于号")]
        MoreThan,

        [Description("<小于号")]
        LessThan,

        [Description("≥大于或等于号 ")]
        MoreThanOrEqual,

        [Description("≤ 小于或等于号")]
        LessThanOrEqual,

        [Description("在某个字符串值中")]
        In
    }

除此以外,一个好的多寡查询
,一般有一个有力的尖端查询模块,那么些模块在无数顺序中都很常见,也是给客户增加查询的一个很好的填补,由于我直接期待自己的Winform开发框架可以革新,所以做了这些通用高级查询模块,希望对之后本人要好独具的档次以及框架本身,都能急忙的施用。

882828九五至尊手机版 38

 在介绍输入条件的时候,大家注意到,查询输入,基本上可以分成几类:其一是正常的文书类型,使用文本框替代即可;其二是下拉列表类型,用户从列表上面选用内容;其三是日期类型,要求用户指定初叶日期和终止日期;其四是数字类型,需求用户指定初步和完工的数值。

1)常规的公文类型标准输入界面:

882828九五至尊手机版 39

2) 下拉列表类型条件输入界面:

882828九五至尊手机版 40

3) 日期类型标准输入界面:

882828九五至尊手机版 41

4) 数字类型标准输入界面:

882828九五至尊手机版 42

882828九五至尊手机版,10、框架提供基于种种数据库(Sqlserver/Oracle/Mysql/Sqlite/Access)的组成

就算大家在其实项目中,一般拔取一种数据库进行拍卖,可是差其余品类,选用的数据库类型或者两样,本Winform开发框架为了便利演示和壮大的内需,内置帮衬了Sqlserver/Oracle/Mysql/Sqlite/Access,越来越多的数据库,也可以透过增加数据库访问基类的法子开展越多数据库的支持。

Winform开发框架之中的具有模块,如用到了多少存储的,如权限管理管理模块、通用数据字典管理模块,均放置扶助那三种数据库的结合支持。整个Winform开发框架的数据库访问,可以手动配置数据库类型,对于同样种数据库,也足以把数量存储分开储存,如工作数据存储在一个数据库,权限管理控制存储在其它一个数据库这种办法。

882828九五至尊手机版 43

Winform开发框架提供多样数据库支持,数据访问基类仍旧很简单,因为我们应用的数据库访问模块是EnterpriseLibrary,把数据库抽象化,并且自己把装有数据库通用操作放在了一个顶级级基类上,具体的数据库基类只须求贯彻转移的局地即可。业务访问类则利用泛型进行包装处理。

因而,Winform开发框架提供了可观封装的数量访问基类,开发代码更少更快捷。

11、框架界面基类也开展合并封装,使用更有利于,效果更统一

为了更好开发常用界面模块,Winform开发框架把部分公用的界面模块,统一放置在了一个BaseUI的类型中,把里面的通用高级查询、通用数据导入模块、常见处理界面基类,插件接口等模块放在一起,根据易于管理和运用。那样开发的模块,重用很多例行的界面,开发效用更快,使用更便宜,效果更统一了。

882828九五至尊手机版 44

12、框架提供基础性的援救,包含合并登陆、闪屏、托盘效能,以及为插件模块提供登陆用户音讯和系统音讯

方方面面Winform开发框架,是有一个框架启动模块进行集中处理的,系统启动后,用户登录处理后,通过动态加载菜单和插件模块,并在中央框架界面中开展显示,提供权限决定和登录用户新闻等方面的框架援助。别的框架援救闪屏图片的动态配置,系统激活热键和托盘裁减灯功用。

882828九五至尊手机版 45

鉴于系统登录后,框架本身蕴藏了用户登录和权限信息,框架动态加载某个模块后,会把用户新闻和权杖控制信息,注入到模块的界面基类中,因而插件的界面模块只假如后续了BaseUI的界面基类,就可见收获到用户音信和权力决定音讯了。

特色计算

Winform框架,本身就是为了可以很快支付一个高效、稳定、雅观大方、扩充性强的选取软件系统。因而我在温馨十年左右的共享软件开暴发涯以及公司项目开发中,不断揣摩,精雕细琢,对广大主要的特点都进行了概括和进步,吸收项目中好的闪光点,借鉴一些好的软件开发思路,力求把软件做的更好;在支付功用方面,除了支付一些例行通用的模块、在模块内部又丰富考虑继承、重用的规则,还对大幅度进步功效的代码生成工具,按照Winform开发框架的落到实处思路和特征,举行了全面优化,使得无论在作业代码生成,如故在界面代码生成方面,均能把开发作用发挥到极致,希望任何Winform开发框架可以不断发挥它的魅力和吸动力,为更加多的人带来希望,体验开发的童趣。

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图