95992828九五至尊2

据悉框架的成本进度,Winform开发框架的基本点特色总计

二月 2nd, 2019  |  882828九五至尊手机版

致力Winform开发框架的切磋和推广,也做了有多少个年头了,从初期的花色雏形到眼前各个首要特点的参加完善,是透过了累累品类的下结论概括和升华,有些则是按照客户必要或者采取前景的急需展开的应有尽有,整个Winform开发框架具有很好的通用性和借鉴性,本文从该Winform开发框架举办包涵统计,力求把种种显要的特点开展一些详实的注明,使我们精通所有Winform开发框架的风貌和特性。

在上篇随笔《Winform开发框架之客户关系管理连串(CRM)的开销总计种类1-界面成效显示》中介绍了自我的整整CRM系统的概貌,本篇继续本种类的篇章,介绍怎样依据自身的《winform开发框架》的根底上展开CRM系统模块的支付工作,希望对大家在系统模块开发具有启示或者协助。

Winform开发框架总体性概括有:扶助插件化应用开发,可以动态配置及加载开发的插件;菜单辅助动态配置,可根据用户权限举办动态控制突显;集成各类独立开发好的模块,如权限管理系列、字典管理模块等,自动更新模块等,达成系统的权能决定、字典管理、软件协理远程自动更新等职能;可重复使用的系统基础模块,Winform分页控件和.NET开发公用类库等;整个框架通过与代码生成工具Database2Sharp举办同盟,可以一键变动全部性框架代码,Winform系统界面代码,开发更迅捷。

在自家一切开发框架的连串布局中,我都指望开发的作业模块尽可能重用,由此根据这一个需求,所有的模块除了有些基础模块外,尽可能和其他作业模块没有其余耦合关系,同时也可以动态对模块进行加载使用,和我在《Winform开发框架之插件化应用框架完毕》的想想一致,各种模块之间可以动态构成起来,完结更多的政工重组。

全体Winform开发框架,提供了诸多周边业务系统提供的功能,包含Excel数据导入导出,能便捷导入自定义模块的Excel数据,飞速导出列表数据;自定义Excel自定义模板报表的成形,生成各个繁复的Excel报表;强大通用的计算图表模块,数据总结更有利;基于多数据的数量查询模块和通用高级查询模块,查询数据更有益;框架提供按照各个数据库(Sqlserver/Oracle/Mysql/Sqlite/Access)的结缘,可以手动配置数据库类型,通用模块内置协理三种数据库切换;框架提供了中度封装的多少访问基类,开发代码更少更急忙;框架界面基类也开展联合封装,使用更便于,效果更统一;框架提供基础性的帮衬,包蕴合并登陆、闪屏、托盘成效,以及为插件模块提供登陆用户音信和系统音讯。

图片 1

Winform开发框架的最首要功用概览如下图所示。

 1、CRM系统的工程项目介绍

本客户关系管理连串,也是依照那几个目的和基本功上开展模块开发,在所有项目模块开发进度中,将会采纳到全方位Winform开发框架的连锁组件模块,包含基础界面模块、程序启动模块、权限管理模块、字典管理模块、分页控件、公用类库、附件管理等公用模块。

全总CRM系统的界面效果如下所示。

图片 2

率先大家来看望CRM系统重点品种工程的布局和表明。

图片 3

解决方案项目工程介绍
WHC.Framework.BaseUIDx 重用模块。各模块的界面基类,包括通用窗体界面基类BaseUI;通用高级查询模块AdvanceSearch;通用Excel导入模块;插件化接口相关类PlugInInterface等。
WHC.Framework.StarterDx 重用模块。插件化应用程序启动界面。通过用户登录后,获取用户的菜单,动态创建菜单并加载插件,该模块集成权限管理系统模块、集成字典数据管理模块、集成多文档界面控件和布局控件、集成美观实用的登陆界面、闪屏展示界面、托盘缩小提示功能、全局运行一次实例限制模块代码等内容。
WHC.CRM.Core 新开发模块。客户关系管理系统的核心模块,包括业务处理、数据接口层、数据访问层、实体层等相关类。
WHC.CRM.UIDx 新开发模块。客户关系管理系统的界面层,包括所系统模块的各种界面、控件等内容。

规划好CRM的连带数据库表后,利用C#代码生成工具Database2Sharp生成框架各层的代码,模块开首支付的时候,可以五回性把装有业务表的代码四回性生成,然后在任何新的缓解方案(.sln)上开展递增式完善即可,若是是持续模块的开销,则要求增量把变化的代码,复制到相关的框架目录即可,整理后的作业逻辑层代码结构如下所示

图片 4

以此时候,我们转变了界面层以下的兼具支行代码,整个代码生成后,一回性即可编译通过,界面层大家此外建立一个Winform项目工程WHC.CRM.UIDx ,然后添加相关的界面引用程序集(如DevExpress的连带界面程序集)。处理完那么些后,大家又足以行使C#代码生成工具Database2Sharp来贯彻界面的火速支付工作了,代码生成工具生成界面的操作界面如下所示,具体生成界面的操作可以参考随笔《采取代码生成工具Database2Sharp设计数据编辑界面》进行打探。

图片 5

终极收获近似项目目录结构的CRM系统界面模块工程。

图片 6

是因为所有CRM系统蕴涵众多界面元素,由此上述模块的界面部分只是里面一些,假设情节较多,可以建立目录举行分类管理,那样会越加清楚。

图片 7

2、CRM系统的界面层代码分析

利用C#代码生成工具Database2夏普,可以快速转移所急需的框架界面代码,包蕴合并种种已有模块的界面基类、导入导出模块援救、高级查询能作用模块,各个实体类对应涉及等情节,那个若是选拔手工操作,成效尤其低下,而且不难失误。即便使用部分代码生成工具,即使没有和现成的界面模块举行很好的结合,也必要开销大量的年华开展规整,上边通过多少个界面代码的突显举行大致的摸底。

1)列表呈现界面的合并和分页整合

图片 8

2)字典模块的结合处理(通过伸张类方式完毕)

图片 9

 3)导入导出模块的组成

        private string moduleName = "客户合同信息";
        /// <summary>
        /// 导入Excel的操作
        /// </summary>          
        private void btnImport_Click(object sender, EventArgs e)
        {
            string templateFile = string.Format("{0}-模板.xls", moduleName);
            FrmImportExcelData dlg = new FrmImportExcelData();
            dlg.SetTemplate(templateFile, System.IO.Path.Combine(Application.StartupPath, templateFile));
            dlg.OnDataSave += new FrmImportExcelData.SaveDataHandler(ExcelData_OnDataSave);
            dlg.OnRefreshData += new EventHandler(ExcelData_OnRefreshData);
            dlg.ShowDialog();
        }

        void ExcelData_OnRefreshData(object sender, EventArgs e)
        {
            BindData();
        }

        bool ExcelData_OnDataSave(DataRow dr)
        {
            string customerName = dr["客户名称"].ToString();
            if (string.IsNullOrEmpty(customerName))
                return false;

            CustomerInfo customerInfo = BLLFactory<Customer>.Instance.FindByName(customerName);
            if (customerInfo == null)
            {
                throw new ArgumentException(string.Format("客户名称【{0}】不存在,记录已跳过", customerName));
            }

            bool success = false;
            bool converted = false;
            DateTime dtDefault = Convert.ToDateTime("1900-01-01");
            DateTime dt;
            ContractInfo info = new ContractInfo();
            info.Customer_ID = customerInfo.ID;//客户ID
            info.HandNo = dr["合同编号"].ToString();
            info.ExpenditureType = dr["收支类型"].ToString();
            info.ContractType = dr["合同类型"].ToString();
            info.ContractName = dr["合同名称"].ToString();
            info.ContractMoney = dr["合同金额"].ToString().ToDecimal();
            converted = DateTime.TryParse(dr["签约日期"].ToString(), out dt);
            if (converted && dt > dtDefault)
            {
                info.SignDate = dt;
            }
........................................

            success = BLLFactory<Contract>.Instance.Insert(info);
            return success;
        }

        /// <summary>
        /// 导出Excel的操作
        /// </summary>
        private void btnExport_Click(object sender, EventArgs e)
        {
            string file = FileDialogHelper.SaveExcel(string.Format("{0}.xls", moduleName));
            if (!string.IsNullOrEmpty(file))
            {
                string where = GetConditionSql();
                List<ContractInfo> list = BLLFactory<Contract>.Instance.Find(where);
                DataTable dtNew = DataTableHelper.CreateTable("序号|int,客户名称,合同编号,收支类型,合同类型,合同名称,合同金额,公司签约人,客户签约人,签约日期,签约地点,乙方名称,合同开始日期,合同结束日期,结算情况,合同状态,关联项目,联系人,联系人电话,联系人手机,合同内容,备注说明,经办人");
                DataRow dr;
                int j = 1;
                for (int i = 0; i < list.Count; i++)
                {
                    dr = dtNew.NewRow();
                    dr["序号"] = j++;
                    dr["客户名称"] = BLLFactory<Customer>.Instance.GetCustomerName(list[i].Customer_ID);//转义为客户名称
                    dr["合同编号"] = list[i].HandNo;
                    dr["收支类型"] = list[i].ExpenditureType;
                    dr["合同类型"] = list[i].ContractType;
......................................
                    dr["经办人"] = list[i].Operator;
                    dtNew.Rows.Add(dr);
                }

                try
                {
                    string error = "";
                    AsposeExcelTools.DataTableToExcel2(dtNew, file, out error);
                    if (!string.IsNullOrEmpty(error))
                    {
                        MessageDxUtil.ShowError(string.Format("导出Excel出现错误:{0}", error));
                    }
                    else
                    {
                        if (MessageDxUtil.ShowYesNoAndTips("导出成功,是否打开文件?") == System.Windows.Forms.DialogResult.Yes)
                        {
                            System.Diagnostics.Process.Start(file);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogTextHelper.Error(ex);
                    MessageDxUtil.ShowError(ex.Message);
                }
            }
        }

4)高级查询模块的咬合

        private FrmAdvanceSearch dlg;
        private void btnAdvanceSearch_Click(object sender, EventArgs e)
        {
            if (dlg == null)
            {
                dlg = new FrmAdvanceSearch();
                dlg.FieldTypeTable = BLLFactory<Contract>.Instance.GetFieldTypeList();
                dlg.ColumnNameAlias = BLLFactory<Contract>.Instance.GetColumnNameAlias();
                dlg.DisplayColumns = "Customer_ID,HandNo,ExpenditureType,ContractType,ContractName,ContractMoney,CompanySigner,CustomerSigner,SignDate,SignLocation,PartyBName,StartDate,EndDate,Settlement,Status,RelatedItems,Contact,ContactPhone,ContactMobile,Content,Note,Operator";

                #region 下拉列表数据

                //dlg.AddColumnListItem("UserType", Portal.gc.GetDictData("人员类型"));//字典列表
                //dlg.AddColumnListItem("Sex", "男,女");//固定列表
                //dlg.AddColumnListItem("Credit", BLLFactory<Contract>.Instance.GetFieldList("Credit"));//动态列表

                #endregion

                dlg.ConditionChanged += new FrmAdvanceSearch.ConditionChangedEventHandler(dlg_ConditionChanged);
            }
            dlg.ShowDialog();
        }

        void dlg_ConditionChanged(SearchCondition condition)
        {
            advanceCondition = condition;
            BindData();
        }

5)编辑界面的基类继承

图片 10

1、接济插件化应用开发,可以动态配置及加载开发的插件

框架已毕基于插件化的选取,如下所示。

图片 11图片 12

援助插件化应用的付出框架能给程序带来持续生命力,也是现阶段无数系统、程序追求的机要方向之一,插件化的模块,在坚守一定的接口标准的根底上,可以完成快捷集成,也就是所谓的热插拔操作,可以极其对已经付出好系统开展增添,而且不会潜移默化已部分职能,不再需求的模块,通过改动配置移除即可。

插件化应用也是当下框架和系统开发的主流趋势,从开支公司的制品管理角度来看,第一可以把控好已部分框架产品,第二得以把里面的人士分配到分裂的业务模块中,让他们依照一定的接口即可飞速支付,从而抓牢协会对作业模块的横向切割和神速支付的频率,更好、统一、高效到位集团化应用框架的搭建和使用。

3、CRM系统的界面层的用户及权限音讯传送

俺们通晓,每个事情模块都可能要求取得当前登录的有些用户信息和权杖音讯,以便达到更好的操纵和数量的展现,如一些模块,可能只要求展现当前用户的数码,由于CRM系统的界面是单身开发,不构成在启动界面模块里面,那么怎么着赢得用户和权力控制音讯呢?例如下边的CRM模块里面的界面,须要基于当下用户获得到客户的分组列表的。

图片 13

先是大家得以在界面基类中贯彻一个接口,以便传递相关的用户和权杖信息。

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

中间IFunction的概念如下所示。

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; }

    }
}

里面就定义了接口举办用户和权杖音讯的赋值。在界面按钮营造相关模块的效劳界面窗体的时候,大家得以为那么些传递传递相关的靶子音讯。

图片 14

        private void barCRMContact_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ChildWinManagement.LoadMdiForm(this, typeof(FrmCustomerContact));
        }

        private void barCRMCustomer_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ChildWinManagement.LoadMdiForm(this, typeof(FrmCustomerManage));
        }

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

                //如果窗体集成了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);
                }

透过在社团窗体的时候,传入相关的用户和权限对象属性即可落成那么些新闻的传递和应用。

其它,为了越发惠及音讯的传递,大家也得以在用户登陆的时候,把这个音信透过Cache对象把它缓存起来,类似Web开发里面的Session功效。

图片 15

 

自身的该CRM系统体系的几篇小说链接如下,供阅读。

Winform开发框架之客户关系管理连串(CRM)的开支总括系列1-界面作用浮现 

Winform开发框架之客户关系管理种类(CRM)的支出总括体系2-基于框架的付出进程 

Winform开发框架之客户关系管理种类(CRM)的支付总括体系3-客户分类和布局管理落到实处 

Winform开发框架之客户关系管理连串(CRM)的费用总计种类4-Tab控件页面的动态加载 

 

2、菜单协助动态配置,可根据用户权限进行动态控制呈现

诚如Winform程序中,菜单都是从来写在主程序中的,那样对于修改和保安菜单的相关音信,可能有所不便,而且对于插件化应用,新增菜单是大面积的事体,这样就需求对菜单举行动态配置管理了,通过后台菜单的布置和权杖的指定,可以落到实处菜单的动态加载和权力验证。

从而菜单也是权力分配的一有些,为了使得管理菜单资源,大家把菜单放到权限管理种类中进行管理控制。

图片 16

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

图片 17

图片 18

 

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

 3.1 权限管理模块

权限的分配和管制,基本上是各类工作系统须求考虑的东西,而这一个常用的事物,在漫天Winform开发框架中,把它看成一个单独的模块,既有益维护管理,也留有接口很简单进行合并,那样可以在档次中反复举行应用。

权力系统需求考虑的种类用户、社团单位、角色、权限定义及分红、菜单管理、用户登录日志等巢倾卵破信息。对于每新增一个系统,大家只必要在权力管理连串中追加一个系统类型定义,以及相关的功力、菜单数据即可,卓殊方便管理。

图片 19

3.2 字典管理模块

除此以外,除了权力的管住,字典管理也是正规工作模块的一个总要成效,因而字典管理模块在Winform开发框架中,也是一个独门的模块进行支付管制,在应用的时候举行合并即可。

字典的归类可以按多级进行分类管理,可以拖拉进入新的分类,非凡便宜。

图片 20

3.3 自动更新模块

貌似情形下,为了实用管理应用程序的宣布及更新,大家要求软件接济远程自动更新效用;在Winform开发框架中再引入一个自动升级翻新的通用模块,这么些活动升级的通用模块除了富有一般的功能外,可以因此安排程序标题、升级路线方法等格局,完结通用化的升官操作,其余急需升高的次序,拿过来就足以采纳,经过项目标构成及优化,已经具备较好的应用前景了。

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

1)程序标题可安排,更新路径可配置,适用于各类急需更新的类型结合。

2)援救文件复制或者对打折扣包进行解压,适合越来越多琐碎程序集的完好升高。

3)帮忙文件更新后自行启动,或者带参数的启航方式。

图片 21

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

4.1 Winform分页控件

为了增加数据的获取及浮现功能,一般情形下,大家都必要对数据开展分页获取和出示,在网络化环境,这种措施获取数据越发重大,在Winform里面,没有现成的分页控件能够运用,因而出于这些考虑,把数量突显、数据导出、数据打印等诸多效果集成一起,更加方便使用。分页控件完美援助列表数据的分页,可以调动显示列及顺序,是还是不是出示复选框,字段别名,奇偶列的水彩变化,列新闻提示和数目复制等等众多实用细致的职能的。

列表的数量绑定及体现代码,通过代码生成工具,可以一键变更所需的界面代码,开发功效飞一般的升级。

图片 22

图片 23  

4.2 .NET公用类库

俗话说,一个好汉十个帮,兵多将广等都说雀巢个道理,有更加多的资源,更丰盛的积聚,都是助你走向成功,走向极端的拉引力。就大家开发者而言,其中技术的积淀、资源的积淀,就是类似一个个英雄、一根根好柴,是大家可以举办连忙开发的担保和拉引力。

这个类库是本身从事多年软件开发,渐渐提炼和意识的一部分闪光点或者好有的,有些是吸纳旁人的美妙的东西,有些是友好渐渐提炼的赏心悦目,此前,在互连网上观察部分开源的连串,总会先看看其是或不是有包装非凡、功用独立的支援类库,发现好的增援类库,总是喜欢若狂好一阵子,学习中渐渐积累,商讨中逐渐提炼,多年过后,略有小成,终为明天所介绍的扶持类库集合。那个帮扶类库平时也并不是拥有的都会用得上,可是有的常用的,大概各类品种就会用到,类库涉及面万分广,可以为我们开发节省成千成万时刻,并且大家也足以根据自己的必要进行扩充完善,形成协调的类库集合。

博客公用类库在线接济文档列表:

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

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

一体框架通过与代码生成工具Database2Sharp举行同盟,可以一键转移全体性框架代码,Winform系统界面代码,开发更急速。

图片 24

在全体Winform开发框架中,Database2Sharp生成出来的代码浮现了老大周全的整合性,可以无缝接入开发的框架序列中,无论是常规的事务逻辑和数码访问层代码,以及部分列表、编辑界面的Winform界面代码,都能高效变动,稍作调整即可满足工作模块的急需。

Database2Sharp是一个概括点击三回鼠标就能到位一周代码量的代码生成工具,功用惊人、友好爱抚,真正的付出好伴侣。提供了对SqlServer
2000、SqlServer
2005、Oracle、Mysql、Access、SQLite的协理;可以转移各样架构代码、Winform界面代码,并且和Winform开发框架周到结合,浮现出更高的支付功能。

图片 25

6、通用的Excel数据导入导出,能便捷导入自定义模块的Excel数据,火速导出列表数据

出于一般的业务系统,常常性的数额导入时很健康的事务需求,因为毕竟使用Excel来操作数据也很便利,或者由于系统之间的数据互换须求,我们须求提供一个进口给客户导入所急需的数量。然而导入数据的时候,差其他作业数据对应区其余Excel文件,很难成功统一,但倘倘使种种事情模型,都创立一个不等的导入界面来操作Excel数据,又会以为可能某种程度上重复劳动,扩充支出及敬服开支。

那么有无一种介于两者之间的章程,来兑现效用的最优化,并且能够合并使用好一个导入的界面呢,在付出世界,只要能想到的,一般也能形成,由于工作的须求,在本人的Winform开发框架中引入了一个通用的多少导入模块,来完毕那么些既是联合,又是浮动的政工必要。Winform框架提供的个通用的Excel数据导入导出机制,通过代码生成工具Database2Sharp自动生成的代码,就富含了何等选拔这些通用导入模块的相关代码以及该模块的导出数据的代码,大家要做的就是在系统运作起来,导出一些数码作为某个模块的Excel模板即可。上面的功能按钮就是使用代码生成工具自动生成的界面包罗的按钮。

图片 26

通用数据导入作用,包罗上边多少个地方的内容。

图片 27

上边就是一个实际变化的功效模块,其导入界面的周转效果。

图片 28

在最底的状态栏里面,但大家保留数据的时候,会调用后台线程进行多上大夫存,并体现数据导入的进程景况,由于是接纳后台线程处理,不会阻塞当前的界面,在多文档的Winform开发框架界面中,可以切换来其余作业界面进行别的处理,不影响总体界面操作。

7、自定义Excel自定义模板报表的浮动,生成种种繁复的Excel报表

洋洋状态下,大家须要转移比较规范的Excel模块,因而自定义模板报表就是一种很好的方案,Winform开发框架提供了二种自定义Excel报表的成形。

图片 29

接纳普通的二维表,即使能满意大多数的意况,不过在一般的作业中,自定义模板的表格根据贴近实际,符合客户的渴求,即使自定义模板的表格,比日常的二维报表复杂一些,可是使用Apose.Cell控件,并在预设模板中预设变量,可以生成很复杂的报表。

现实的自定义模板报表可以参见下自己总计的两篇小说。

利用Aspose.Cell控件完成Excel高难度报表的变迁(一)

行使Aspose.Cell控件完成Excel高难度报表的生成(二)

比如生成一个正规的出库单,那么些表单有表头新闻,列表数据新闻,并非一个见怪不怪的二维表,而且那种格式比较固化,由此很符合自定义模块报表的更动操作。

图片 30  

 其他安顿模板如下所示:

 

图片 31 

其实变化的表格如下所示:

图片 32

8、强大通用的总结图表模块,数据总结更便于

计算图表在不少连串都可能用到,集成到框架中,更便利大家对一些图片项目标安插领悟以及作用的选定。在相似的观念的框架中,可以运用ZedGraph开源控件或者微软自带的MSChart举行图片设计,DevExpress控件套件有温馨的图纸控件,那里最首要介绍基于DevExpress控件的图形控件举行图片设计。

8.1 普通总结图表

此处指的常常计算图表,只是对表某一品类展开单一的计算,可以从饼状图、柱状图的图形中展示这个项目分级所占的百分比和数值,在Winform框架中的普通计算图表模块中,包含了饼状图、柱状图和数量表格,这样更便宜对数码举办周全的分析和查看。整个模块是足以选择的,指定字段属性就可以相比较合理的彰显出差异分类项目标计算效用了,具体职能图如下所示。

图片 33

上边的计算图表中,还含有了下边多个成效模块,如下所示。

图片 34

图片 35

8.2 动态项目总计图表

奇迹,对于表里面的数量,可能要对分裂种类的始末展开动态的总括,以确定他们分其他比重情况,那么那些动态项目标总计图表就比较适当了,例如,对于患儿资料的田间管理,可能需求计算种种病种所占的比重或者各样工作类型的犯病率,那个不太确定的统计项目,就须求一个可以扶助动态项目标总括图表进行帮忙,对于本Winform框架,为了较好表现那些项目报表的含义,我接纳了对备件类型所占的比重进行一个总括分析,得到上边的统计图表,如下所示。

图片 36

上边的图片总结,除了可以基于一些尺度进行界定查询范围外,仍能对有些预设的总括字段进行动态选拔,然后根据字段里面的种种内容(统计项目)举办计算,那样就可以相比实用的统计出各体系型的数值和比例了。

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

在Winform框架之中,可以对某一年各月份的出入库数量举办一个解析,获得下边的总括图。

图片 37

如上数据不多,展现可能不太为难,上面我付出我另一个软件系统的界面,其中对患儿的出入院记录进行一个计算比较分析,计算报表如下所示。

图片 38

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开发框架可以改正,所以做了那么些通用高级查询模块,希望对今后本身要好独具的类型以及框架本身,都能便捷的运用。

图片 39

 在介绍输入条件的时候,大家注意到,查询输入,基本上可以分成几类:其一是正规的公文类型,使用文本框替代即可;其二是下拉列表类型,用户从列表上边选择内容;其三是日期类型,须要用户指定先导日期和终止日期;其四是数字类型,必要用户指定开头和完工的数值。

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

图片 40

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

图片 41

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

图片 42

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

图片 43

10、框架提供基于多种数据库(Sqlserver/Oracle/Mysql/Sqlite/Access)的组成

尽管我们在事实上项目中,一般拔取一种数据库进行拍卖,不过差别的体系,选用的数据库类型或者两样,本Winform开发框架为了便利演示和扩大的内需,内置辅助了Sqlserver/Oracle/Mysql/Sqlite/Access,更多的数据库,也得以透过增添数据库访问基类的法门开展越来越多数据库的支撑。

Winform开发框架之中的具备模块,如用到了数量存储的,如权限管理管理模块、通用数据字典管理模块,均放置援助那三种数据库的三结合接济。整个Winform开发框架的数据库访问,可以手动配置数据库类型,对于同样种数据库,也得以把多少存储分开储存,如工作数据存储在一个数据库,权限管理控制存储在其余一个数据库那种艺术。

图片 44

Winform开发框架提供各种数据库协理,数据访问基类如故很简短,因为大家运用的数据库访问模块是EnterpriseLibrary,把数据库抽象化,并且我把所有数据库通用操作放在了一个极品基类上,具体的数据库基类只必要完毕转变的一对即可。业务访问类则运用泛型举行包装处理。

为此,Winform开发框架提供了莫大封装的数码访问基类,开发代码更少更迅捷。

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

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

图片 45

12、框架提供基础性的支撑,包涵合并登陆、闪屏、托盘功用,以及为插件模块提供登陆用户新闻和种类音信

成套Winform开发框架,是有一个框架启动模块进行集中处理的,系统启动后,用户登录处理后,通过动态加载菜单和插件模块,并在关键性框架界面中举办呈现,提供权限控制和登录用户新闻等方面的框架帮忙。其余框架支持闪屏图片的动态配置,系统激活热键和托盘收缩灯功用。

图片 46

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

特色总计

Winform框架,本身就是为着可以急迅支付一个很快、稳定、美观大方、扩张性强的利用软件系统。由此我在大团结十年左右的共享软件开暴发涯以及商店项目支付中,不断揣摩,精雕细琢,对很多重中之重的性状都开展了汇总和进步,吸收项目中好的闪光点,借鉴一些好的软件开发思路,力求把软件做的更好;在付出功用方面,除了开发一些常规通用的模块、在模块内部又足够考虑继承、重用的平整,还对大幅度升高功用的代码生成工具,依据Winform开发框架的落成思路和特征,举行了一揽子优化,使得无论在作业代码生成,依然在界面代码生成方面,均能把开发成效发挥到极致,希望任何Winform开发框架可以持续发挥它的魅力和吸引力,为更加多的人带来希望,体验开发的意趣。

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图