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

简介:

我在上一篇《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函数,我是用来生成固定怎么多行的操作,使得列表默认不少于固定的函数,否则列表不好看。

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

本文转自博客园伍华聪的博客,原文链接:Winform开发框架之通用人员信息管理实现代码介绍,如需转载请自行联系原博主。



目录
相关文章
|
7月前
|
安全
dapp互助预约排单系统开发步骤指南/案例设计/规则详细/方案逻辑/源码程序
-Determine the core functions and objectives of the system, understand user needs and expectations.
|
1月前
|
小程序 UED
人力资源小程序的设计与开发步骤
人力资源小程序的设计与开发步骤
20 1
|
25天前
|
安全
什么是短剧系统开发/需求设计/逻辑方案/项目指南
The short drama system development plan refers to the development of a system for organizing and managing the process of short drama production, release, and playback.
|
6月前
|
敏捷开发 存储 测试技术
链动2+1系统开发项目案例丨指南教程丨需求方案丨功能设计丨成熟技术丨步骤逻辑丨源码程序
用户需求导向:系统开发应以用户需求为中心,从用户的角度思考,了解用户的真实需求和期望,以提供优质的用户体验。
|
6月前
|
存储 前端开发 安全
dapp矩阵公排互助预约排单抢单项目系统开发指南流程丨案例设计丨功能逻辑丨规则玩法丨项目方案丨源码程序
需求分析:与团队明确系统的需求和目标,包括公排互助预约排单抢单项目系统的功能、规则、奖励机制等方面。
|
6月前
|
AndFix vr&ar 图形学
潮玩元宇宙/大逃杀游戏系统开发详细案例丨规则流程丨方案逻辑丨功能设计丨需求项目丨源码出售
The development of Chaoyu Metaverse Escape Game System refers to the creation and construction of a virtual reality game system to provide an immersive gaming experience, allowing players to participate in a virtual world for escape and combat.
|
7月前
|
安全
dapp众筹矩阵公排互助系统开发指南详细丨功能需求丨案例项目丨方案项目丨源码程序
Requirement analysis and planning: Clarify the system's goals and functional requirements. Understand the characteristics and working methods of the DApp crowdfunding matrix mutual assistance system. Collect user requirements, define the crowdfunding mechanism, matrix common ranking algorithm, and m
|
9月前
|
存储 前端开发 JavaScript
构建高效学生志愿者活动管理系统:基于前后端分离的设计与实现
构建高效学生志愿者活动管理系统:基于前后端分离的设计与实现
构建高效学生志愿者活动管理系统:基于前后端分离的设计与实现
|
搜索推荐 数据管理 开发者
合同管理的高级流程设计|学习笔记
快速学习合同管理的高级流程设计
242 0
合同管理的高级流程设计|学习笔记
|
9月前
|
存储 安全
DAPP/3M互助拆分公排双轨系统开发详细逻辑/案例分析/方案项目/技术分析/源码平台
 DApp是指基于区块练技术的去中心化应用程序,它的特点是去中心化、透明、安全、不可篡改等特点。