我在上一篇《Winform开发框架之通用人员信息管理》随笔中介绍了这个通用人员信息管理的大致实现界面和思路,本篇就其中的实现细节做进一步的分析和共享,希望大家对其中的实现代码进行一个了解,并希望多多提出宝贵意见。通用人员信息管理模块,这个模块其实在很多场合都可能用到,如企业员工管理、科室员工管理等等,这些要求登记人员详细资料及图片等信息的系统模块。

1、项目框架布局

以上几个模块分开是为了适应更多的项目需要,如可能用到WCF模块,那么实体类需要独立引用。但是如果是纯粹的Winform模块,以最少化项目为管理原则,那么就不需要那么多工程了,这样也方便项目的集成引用。虽然我们把基于多数据库支持的逻辑及数据库访问实现,封装到一个WHC.StaffData.Core项目里面,但是如果是Winform的项目应用,我们只需要引用他的代码路径就可以了,这样就保证了一份代码实体,多次外部应用的良好处理。如下所示。

这样的Winform模块整合后,我们在实际集成项目的时候,就很方便,人员管理模块就只有一个WHC.StaffDataDx程序集,不用管理太多关于人员模块的程序DLL了(否则有UI层、BLL层、DAL层、IDAL层、Entity层等等很多项目工程,这样一旦模块分的比较多,几十个就出来了,非常不便于管理)。

以上就是一个集成测试项目用到的相关应用,我们看到,人员管理模块里面只有一个程序集,其他的是人员管理模块用到的其他公用模块,这样比较方便管理,更利于大型项目的集成工作,不同的模块职责不同,维护可能也交由不同的技术人员维护即可,而且最大的优点是所有项目都通用,提高重复利用的效率。

集成测试项目是我们实际集成的参考例子,使用很简单,如下所示。

private void btnAddStaff_Click(object sender, EventArgs e){FrmEditStaff dlg = new FrmEditStaff();dlg.ShowDialog();}private void btnStaffList_Click(object sender, EventArgs e){FrmStaff dlg = new FrmStaff();dlg.ShowDialog();}

2、多数据库支持

整个小项目,是我Winform开发框架的缩影,我的Winform开发框架都基本上遵循一个规则来做各独立模块的开发,都具有多数据库支持的特性,良好的框架布局和高质量的代码特性。

我的传统Winform开发框架的设计图,如下所示。其中界面层UI直接访问BLL层,不需要通过网络,其中公用辅助类库Common层、实体类层可以在各个层中访问,并把常用的权限管理、字典管理封装为组件模块,直接调用,底层则使用工厂方式,来支持各种不同的数据库,其中UI层、BLL层、DAL层、实体层均使用继承类方式实现最良好的封装、最优的代码设计。

当然下面的框架示意图也是适用于这个人员管理模块的了。

实现多数据库支持的框架项目实际代码结构如下所示。

他们几个层之间的关系我在很早介绍框架数据库结构就介绍过,如下所示。

他们几个层之间的关系,具有非常强的继承关系,数据访问层有一个超级基类,抽象于各种数据库的基础上而形成,对于不同的数据库,还有一个一般的基类,用来实现详细化的数据库特性,每个业务类,明确继承关系后,就具有一份非凡的本领(具有几乎所有常用到的各类通用接口),很多时候我们基本不需要写任何和数据库操作的代码了。

3、界面实现

对于界面的设计,一直也希望能比较好的体现出我的设计思想,在整个人员信息管理中,有人员学习情况、履历情况、家庭情况、出国情况、职称情况等,界面基本上比较统一,就是一个列表的管理,常规的管理思路,一般还需要对列表的顺序可以自由调整,这是很常见的功能,因此,这里也引入了一个可以调整顺序的GridControlDrager 辅助类,这个就是在使用时,用户可以拖动记录到任意的顺序。

实现代码如下所示:

        private void StaffResumeControl_Load(object sender, EventArgs e){if (!this.DesignMode){GridControlDrager drager = new GridControlDrager(this.gridControl1);drager.ProcessDragRow += new GridControlDrager.ProcessEventHandler(drager_ProcessDragRow);}}bool drager_ProcessDragRow(int sourceRowHandle, int targetRowHandle){DataTable table = this.gridControl1.DataSource as DataTable;if (table != null){string sourceID = this.gridView1.GetRowCellValue(sourceRowHandle, "ID").ToString();string targetID = this.gridView1.GetRowCellValue(targetRowHandle, "ID").ToString();bool result = BLLFactory<StaffResume>.Instance.UpdateTwoSeq(sourceID, targetID);if (result){DataRow sourceRow = table.Rows[sourceRowHandle];DataRow row = table.NewRow();row.ItemArray = sourceRow.ItemArray;table.Rows.Remove(sourceRow);table.Rows.InsertAt(row, targetRowHandle);this.gridControl1.DataSource = table;this.gridView1.FocusedRowHandle = targetRowHandle;}}return true;}

几个模块大致的设计界面如下所示,然后在窗体里面集成就可以了。

运行时刻的界面效果如下所示。

以上还包含了附件的管理,这个模块在之前的《Winform开发框架之通用附件管理模块》有介绍,这里不再赘述了。

4、Word报表导出操作

上篇随笔介绍了Word导出的格式,导出的人员信息表如下所示:

我们看到,里面很多信息是单字段的,有部分是列表的,对于单字段,我们采用在模板中添加标签引用方式,然后替换其中的标签引用的文本实现,如下所示。

#region 通过书签方式替换内容Dictionary<string, string> dictBookMark = new Dictionary<string, string>();//姓名,性别,出生时间,政治面貌,党团时间,民族,籍贯,职务,任职时间,工作时间,最高学历,获学历时间,最高学位,//获学位时间,婚否,职称,职称时间,是否独生子女StaffInfo staffInfo = BLLFactory<Staff>.Instance.FindByID(ID);if (staffInfo != null){dictBookMark.Add("姓名", staffInfo.Name);dictBookMark.Add("性别", staffInfo.Sex);dictBookMark.Add("出生时间", staffInfo.BirthDate.GetDateTimeString("yyyy.MM.dd"));dictBookMark.Add("政治面貌", staffInfo.Political);dictBookMark.Add("党团时间", staffInfo.PartyDate.GetDateTimeString("yyyy.MM"));dictBookMark.Add("民族", staffInfo.Nationality);dictBookMark.Add("籍贯", staffInfo.NativePlace);dictBookMark.Add("职务", staffInfo.OfficialRank);dictBookMark.Add("任职时间", staffInfo.ServingDate.GetDateTimeString("yyyy.MM"));dictBookMark.Add("工作时间", staffInfo.WorkingDate.GetDateTimeString("yyyy.MM"));dictBookMark.Add("最高学历", staffInfo.HighestEducation);dictBookMark.Add("获学历时间", staffInfo.EducationDate.GetDateTimeString("yyyy.MM"));dictBookMark.Add("最高学位", staffInfo.HighestDegree);dictBookMark.Add("获学位时间", staffInfo.DegreeDate.GetDateTimeString("yyyy.MM"));dictBookMark.Add("婚否", staffInfo.MarriageStatus);dictBookMark.Add("职称", staffInfo.Titles);dictBookMark.Add("职称时间", staffInfo.TitlesDate.GetDateTimeString("yyyy.MM"));dictBookMark.Add("是否独生子女", staffInfo.ChildStatus);StaffAwardInfo awardInfo = BLLFactory<StaffAward>.Instance.FindSingle(condition);if (awardInfo != null){dictBookMark.Add("受奖情况", awardInfo.Note);}}Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);foreach (string name in dictBookMark.Keys){Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks[name];if (bookmark != null){bookmark.Text = dictBookMark[name];}} #endregion

对于列表的内容,我们就要引入Aspose.Word的MailMerge功能了,先在固定模板中插入并定义好相关的域引用,如下所示。

创建一系列的域代码引用后,才能利用Aspose.Word的MailMerge功能。

上图红色部分为对于一个列表必须要创建的域代码,包括TableStart:和TableEnd的标识。

创建好这些后,绑定数据源的操作不算复杂,如下所示。

                Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);List<StaffStudyInfo> studyList = BLLFactory<StaffStudy>.Instance.Find(condition);DataTable dtStudy = DataTableHelper.ToDataTable<StaffStudyInfo>(studyList);dtStudy.TableName = "study";FillStaticRow(dtStudy, 5);List<StaffTitlesInfo> titleList = BLLFactory<StaffTitles>.Instance.Find(condition);DataTable dtTitle = DataTableHelper.ToDataTable<StaffTitlesInfo>(titleList);dtTitle.TableName = "title";FillStaticRow(dtTitle, 5);

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

                DataSet ds = new DataSet();ds.Tables.Add(dtStudy);ds.Tables.Add(dtTitle);ds.Tables.Add(dtResume);ds.Tables.Add(dtAbroad);ds.Tables.Add(dtFamily);doc.MailMerge.ExecuteWithRegions(ds);                doc.Save(saveFile);if (MessageDxUtil.ShowYesNoAndTips("导出成功,是否打开文件?") == System.Windows.Forms.DialogResult.Yes){Process.Start(saveFile);}

其中的FillStaticRow函数,我是用来生成固定怎么多行的操作,使得列表默认不少于固定的函数,否则列表不好看。

以上就是我在开发这个模块中的一些经验心得,希望抛砖引玉,对大家有帮助的同时,也能获得更多的反馈意见,相互促进交流。

转载于:https://www.cnblogs.com/wuhuacong/archive/2013/03/18/2965671.html

Winform开发框架之通用人员信息管理实现代码介绍相关推荐

  1. Winform开发框架之通用短信邮件通知模块

    在做Winform项目的时候,一直有一个梦想,就是希望把所有的组件模块组合即可组装成一个完整的项目系统(或者至少可以大部分完成).在之前介绍的<Winform开发框架之通用附件管理模块>里 ...

  2. Winform开发框架之通用高级查询模块--SNF快速开发平台3.3-Spring.Net.Framework

    最近项目确实忙,但也是一直忙于有关项目和框架技术的事情,也一直致力于改善我的WInform开发框架.使得自己及客户使用起来更加方便,更加友好,更加高效. 在很多程序模块中都很常见,也是给客户扩展查询的 ...

  3. Winform开发框架之混合型框架的实现

    我在之前一篇文章<Winform开发框架之框架演化>中,介绍了传统Winform开发框架.传统WCF开发框架.离线式WCF开发框架.混合式WCF开发框架,其中前面两种就是大家比较熟悉的框架 ...

  4. Winform开发框架之肖像显示保存控件的实现

    我们在开发一些Winform程序的时候,除了常规的显示普通数据外,有的时候需要显示一些人员肖像或者一些车辆等物体的图片,一般这些内容较小,所以以二进制存储在数据库是一个不错的方案.但由于它们虽然很常用 ...

  5. Winform开发框架重构总结

    最近一直致力于Winform开发框架的重构工作,因为发现要维护传统Winform开发框架.WCF开发框架.混合式开发框架,以及相关的模块,包括权限管理.字典管理模块.附件管理.人员管理等一些辅助模块, ...

  6. Winform开发框架之插件化应用框架实现

    支持插件化应用的开发框架能给程序带来无穷的生命力,也是目前很多系统.程序追求的重要方向之一,插件化的模块,在遵循一定的接口标准的基础上,可以实现快速集成,也就是所谓的热插拔操作,可以无限对已经开发好系 ...

  7. 参照企业微信审批业务,在Winform开发框架中工作流模块的实现业务审批

    目前微信的企业号已经切换到企业微信里面,这个是一个APP程序,提供了很丰富的企业应用,其中包括了业务审批处理,审批业务包括请假.报销.费用.出差等很多个审批场景,在Winform开发框架中工作流模块这 ...

  8. Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程...

    在上篇随笔<Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示>中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的<winform ...

  9. Winform开发框架中工作流模块的业务表单开发

    在我们开发工作流的时候,往往需要设计到具体业务表单信息的编辑,有些是采用动态编辑的,有些则是在开发过程中处理的,各有各的优点,动态编辑的则方便维护各种各样的表单,但是数据的绑定及处理则比较麻烦,而自定 ...

最新文章

  1. PB初体验 class one
  2. HDU 6044 Limited Permutation(2017多校)【计数 快速读入挂 线性逆元】
  3. ML之Clustering之LPA:LPA算法主要思路、输出结果、代码实现等相关配图之详细攻略
  4. 计算机管理咂打开,6个开机启动项,害我差点把电脑砸了!禁用后电脑果然开机5秒...
  5. Codeforces 1066 C(思维)
  6. SpringBoot 自带工具类~StreamUtils
  7. vue二维码生成插件 - npm安装篇
  8. 95-910-140-源码-FlinkSQL-FlinkSQL简介
  9. java实现折半查找_java语言之实现折半查找算法
  10. (九)ubuntu解决resolv.conf被重写问题
  11. 浅谈工业4.0时代,深信服adesk桌面云如何助力智能工厂.
  12. c语言社交网络,图论在社交网络中的应用研究
  13. java2048_java之2048
  14. C2Prog串口烧写TMS320F28335 Flash实验
  15. js加载第三方字体,检测加载完成事件
  16. ESP8266 AT指令设置及51单片机的控制
  17. 图片二维码,如何将图片制作成二维码
  18. html5怎么导出表格,《网页 导出到 excel表格数据》 如何将网页表格导出到excel
  19. 2019年中兴秋招在线笔试题目
  20. 我用python分析买房数据

热门文章

  1. python浪漫代码-Python打造浪漫的心形,助你情人节表白成功!
  2. python在财务上的应用-利用python实现周期财务统计可视化
  3. 学python工资高吗-Python工资一般是多少 看完吓你一跳
  4. python条件语句-Python 条件语句
  5. python画笑脸-用Python画滑稽
  6. python创建csv文件并写入-Python数据写入csv格式文件
  7. python编程入门到实践 百度云-python网络爬虫从入门到实践pdf
  8. python冒号错误-python冒号错误语法无效
  9. python利器的使用-PPython:PHP 拥抱 Python 的利器
  10. python 程序流程控制结构-python之流程控制语句