在我们开发工作流的时候,往往需要设计到具体业务表单信息的编辑,有些是采用动态编辑的,有些则是在开发过程中处理的,各有各的优点,动态编辑的则方便维护各种各样的表单,但是数据的绑定及处理则比较麻烦,而自定义开发的,则数据弹性很大,方便修改调整。本篇随笔基于表单的开发设计过程,介绍在工作流中如何新增一个业务表单,以便快速的实现审批业务的上线处理。

1、业务表单的基类继承

首先我们来了解一下业务表单的对应关系,一般创建一个业务流程处理,都需要有一个具体的创建业务表单的界面,以及一个查看处理表单的界面。

为了方便,我们尽可能减少代码编写,我们需要把大多数的逻辑处理放在基类实现,这样我们在新增一个业务表单的时候就可以减少很多代码编写及维护了。

如对于FrmAddApply类定义如下,我们定义一些抽象接口用于下面的业务表单实现

    /// <summary>/// 创建申请单的窗体基类/// </summary>public partial class FrmAddApply : BaseForm{/// <summary>/// 表单ID/// </summary>public string FormID { get; set; }/// <summary>/// 申请单ID/// </summary>public string ApplyId { get; set; } public FrmAddApply(){InitializeComponent();}/// <summary>/// 显示数据的函数(子类必须实现)/// </summary>public virtual void DisplayData() { }/// <summary>/// 实现控件输入检查的函数(子类必须实现)/// </summary>/// <returns></returns>public virtual bool CheckInput() { return true; }/// <summary>/// 编辑状态下的数据保存(子类必须实现)/// </summary>/// <returns></returns>public virtual bool SaveUpdated() { return true; }/// <summary>/// 新增状态下的数据保存(子类必须实现)/// </summary>/// <returns></returns>public virtual bool SaveAddNew() { return true; }...................

这样我们创建一个新的业务表单,只需要利用代码生成工具,生成所需要的各层框架代码,然后再生成Winform窗体代码,复制部分界面处理代码过来这个业务表单的子类即可。

下面是一个请假申请的业务表单设计,如下所示。

我们看到这个表单可以使用代码生成工具Database2Sharp快速生成后进行一定调整的,而这个编辑表单的界面,我们只需要使用自动生成的部分代码即可。

相关代码只需要复制上面的新增、更新、显示数据的代码即可。

对于查看申请单的基类FrmViewApply类,我们更加简单,我们需要把它的自定义界面控件加载出来即可。

下面是查看申请单的基类,封装了相关的处理逻辑。

    /// <summary>/// 本窗体是通用的查看申请单界面基类。/// 为减少开发相关页面的工作量,只需要创建一个新窗体,并继承本窗体,然后在子窗体Form_Load函数里面,初始化对应的申请单显示控件即可。/// </summary>public partial class FrmViewApply : BaseDock{/// <summary>/// 申请单ID/// </summary>public string ApplyId { get; set; }/// <summary>/// 申请单自定义控件/// </summary>public BaseUserControl ApplyControl { get; set; }/// <summary>/// 默认构造函数/// </summary>public FrmViewApply(){InitializeComponent();}private void FrmViewApply_Load(object sender, EventArgs e){if (!this.DesignMode){InitToolBar();}}/// <summary>/// 初始化申请单控件/// </summary>protected virtual void InitApplyControl(BaseUserControl control){if (control != null){this.ApplyControl = control;this.ApplyControl.Dock = DockStyle.Fill;this.Controls.Add(control);}}/// <summary>/// 打印申请单控件内容(默认调用窗体打印)/// </summary>protected virtual void PrintApplyControl(){if(this.ApplyControl != null){PrintFormHelper.Print(this.ApplyControl, false);}}/// <summary>/// 表单另存为/// </summary>protected virtual void ApplySaveAs(){}/// <summary>/// 初始化工具栏的按钮和状态/// </summary>protected virtual void InitToolBar(){................//基类实现,控制什么时候该做什么审批处理,以及一些常见按钮
        }.................

查看请假申请单的窗口就是继承这个FrmViewApply即可,如下所示。

    /// <summary>/// 查看请假申请单的窗体/// </summary>public partial class FrmViewLeave : FrmViewApply{private LeaveControl control = null;public FrmViewLeave(){InitializeComponent();}private void FrmViewLeave_Load(object sender, EventArgs e){//初始化控件并展示在基类窗体里面control = new LeaveControl();control.ApplyId = this.ApplyId;control.DisplayData();base.InitApplyControl(control);}}

这个就是全部的窗体源码了,主要的内容我们看到是在LeaveControl这个用户控件类里面的了,

而这个控件主要就是上面编辑请假申请单的界面设计,并复制相关的显示数据代码即可。

相关界面代码如下所示。

    /// <summary>/// 查看请假申请单的内容显示控件/// </summary>public partial class LeaveControl : BaseUserControl{/// <summary>/// 申请单ID/// </summary>public string ApplyId { get; set; }public LeaveControl(){InitializeComponent();SetReadOnly();}/// <summary>/// 设置整个窗体布局为只读并设置只读的背景颜色/// </summary>private void SetReadOnly(){this.layoutControl1.OptionsView.IsReadOnly = DevExpress.Utils.DefaultBoolean.True;this.layoutControl1.Appearance.ControlReadOnly.BackColor = Color.SeaShell;}private void LeaveControl_Load(object sender, EventArgs e){this.applyInfoControl1.ApplyId = this.ApplyId;this.applyInfoControl1.BindData();}/// <summary>/// 初始化数据字典/// </summary>private void InitDictItem(){//初始化代码
        }/// <summary>/// 数据显示的函数/// </summary>public void DisplayData(){InitDictItem();//数据字典加载(公用)//由于申请单一般是用申请表单入口,而非业务数据表,因此只能传入ApplyId获取信息if (!string.IsNullOrEmpty(ApplyId)){....................}

通过上面定义的对应表单的窗体基类,可以减少我们重复编码的需要,我们只需要利用最有效率的生成界面,然后复制代码后调整即可快速生成我们所需要的不同表单界面。

每个表单我们放在一个目录上,这样我们就可以很好管理它们了。

2、业务表单的动态展示处理

上面介绍了业务表单的填写、查看两个不同的窗口,我们在申请单的审批界面里面,统一显示不同的表单,以及创建不同的业务表单界面,这种动态的处理可以实现不同业务表单的创建及显示界面。

如我的审批工作中,表单的显示界面如下所示,查看具体表单后,可以动态展示不同的业务窗口界面。

另外我们在创建业务表单的时候,根据数据库的配置信息,动态展示所有可以展示的创建入口,单击相关的按钮,可以动态调用创建对应的表单界面。

创建流程业务表单的入口如下所示。

在我的审批工作界面,动态创建对应的查看表单窗体代码如下所示。

        /// <summary>/// 分页控件编辑项操作/// </summary>private void winGridViewPager1_OnEditSelected(object sender, EventArgs e){ //获取记录ID和表单IDstring ID = this.winGridViewPager1.gridView1.GetFocusedRowCellDisplayText("ID");string FormId = string.Concat(this.winGridViewPager1.gridView1.GetFocusedRowCellValue("FormId"));if (!string.IsNullOrEmpty(ID) && !string.IsNullOrEmpty(FormId)){var formInfo = BLLFactory<BLL.Form>.Instance.FindByID(FormId);if (formInfo != null && !string.IsNullOrEmpty(formInfo.ApplyWin2)){try{//根据配置的查看窗体,动态构建查看申请单对象FrmViewApply dlg = Assembly.GetExecutingAssembly().CreateInstance(formInfo.ApplyWin2) as FrmViewApply;if (dlg != null){dlg.ApplyId = ID;dlg.OnDataSaved += new EventHandler(dlg_OnDataSaved);if (DialogResult.OK == dlg.ShowDialog()){BindData();}}}catch (Exception ex){LogHelper.Error(ex);MessageDxUtil.ShowError(ex.Message);}}}}

这个代码替代了需要手动创建不同对象的处理

    var dlg = new FrmViewAssignWork();dlg.ApplyId = ID;dlg.OnDataSaved += new EventHandler(dlg_OnDataSaved);if (DialogResult.OK == dlg.ShowDialog()){BindData();}

同理,对于创建编辑界面,我们也可以同样的方法动态创建相关的编辑表单界面,如下代码所示。

WInform开发框架之工作流系列文章:

Winform开发框架之简易工作流设计

Winform开发框架中工作流模块的表设计分析

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

Winform开发框架中工作流模块之审批会签操作

Winform开发框架中工作流模块之审批会签操作(2)

Winform开发框架中工作流模块的业务表单开发相关推荐

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

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

  2. Winform开发框架中工作流模块之审批会签操作

    在前面介绍了框架中工作流的几个开发过程,本篇随笔重点介绍一下日常审批环节中的具体处理过程,从开始创建表单,以及各个审批.会签过程的流转过程,希望大家对其中流程的处理有一个大概的印象. 1.请假申请表单 ...

  3. Winform开发框架中工作流模块之申请单草稿处理

    在我们开发工作流模块的时候,有时候填写申请单过程中,暂时不想提交审批,那么可以暂存为草稿,以供下次继续填写或者提交处理,那么这个草稿的功能是比较实用的,否则对于一些填写内容比较多的申请单,每次要重填写 ...

  4. Winform开发框架中工作流模块的动态处理

    在工作流处理表中,首先我们区分流程模板和流程实例两个部分,这个其实就是类似模板和具体文档的概念,我们一份模板可以创建很多个类似的文档,文档样式结构类似的.同理,流程模板实例为流程实例后,就是具体的一个 ...

  5. 流程多节点调用同一张业务表单的锚点问题

    在工作流的实施中,经常会有客户提出,一个业务流程中,同一张业务表单用于多个节点上,即流程的多个节点上挂的都是同一张业务表单,这样对业务表单的制作就会轻松很多. 在工作流软件产品中,业务表单挂接到流程的 ...

  6. Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

    Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持 在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很 ...

  7. Winform开发框架中的综合案例Demo

    在实际的系统开发中,我们往往需要一些简单的的案例代码,基于此目的我把Winform开发框架中各种闪光点和不错的功能,有些是我们对功能模块的简单封装,而有些则是引入了一些应用广泛的开源组件进行集成使用, ...

  8. 工作流集成第三方jsp表单

    工作流系统集成表单的过程,其实就是一个调用流程引擎api函数的集成过程. 工作流引擎只负责抽象的流程的流转,业务模块的实现,是在业务表单中完成.在和工作流系统集成的时候,完成表单提交的同时,再调用流程 ...

  9. Oracle项目业务表单设计:Oracle PrimaveraUnifier BP

    目录 基本介绍 Basic Introduction 业务流程组件 Business Process Components 数据定义 Data Definitions 数据要素 Data Elemen ...

最新文章

  1. c语言测试1到3章,2013计算机等级考试二级《C语言》复习:第三章第1节
  2. 【NLP】图解Transformer(完整版)
  3. Qt5模型/视图结构-视图(View)
  4. java用mysql存储图片_Java存储图片到Mysql
  5. 通讯录 app 使用哪种协议查找服务器上存储的联系人?,uniapp通讯录查找
  6. eclise,myeclise,sts 打叉但是没提示解决办法
  7. Linux_CentOS 7下Nginx服务器的安装配置
  8. Jupyter更改主题和字体及远程访问
  9. DSOFramer原有的接口说明
  10. java 纯真ip数据库_纯真IP数据库格式读取方法(JAVA/PHP/Python)
  11. Mac环境下反编译Apk(入门)
  12. 网站创业项目商业计划书的写法
  13. 我的 Hadoop 3.2.2 之旅 【收藏夹吃灰系列】
  14. vue-i18n的入门使用
  15. Python爬虫——下载音乐
  16. 【渝粤题库】陕西师范大学600004 中级有机化学 作业(专升本)
  17. 【Vue3.0 + Element-plus】el-tree树状结构节点前箭头样式修改
  18. linux shell中'',和``的区别
  19. Oss endpoint can‘t be empty.
  20. 单线,双线,三线与BGP的区别

热门文章

  1. Redmine Feedback
  2. s:select 使用
  3. java写文件方法之比较
  4. [zt]如何用Javascript获得TextArea中的光标位置
  5. 推荐系统-03-简单基于用户的推荐
  6. python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)...
  7. java中的assert
  8. 27. FormPanel类的defaults属性
  9. php在没用xdebug等调试工具的情况下如何让调试内容优雅地展现出来?--php数组格式化...
  10. Tomcat 6 部署工程总结,使用JNDI数据源配置