WinForm应用实战开发指南 - 如何开发工作流模块的申请单草稿?

2024-01-21 06:59

本文主要是介绍WinForm应用实战开发指南 - 如何开发工作流模块的申请单草稿?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我们开发工作流模块的时候,有时候填写申请单过程中,暂时不想提交审批,那么可以暂存为草稿,以供下次继续填写或者提交处理,那么这个草稿的功能是比较实用的,否则对于一些填写内容比较多的申请单,每次要重填写很多数据,那会被用户骂的,从用户的角度上来讲,提供草稿保存的功能是比较友好的。本文介绍在工作流模块中使用一种通用的存储方式来存储及显示申请单草稿的信息。

PS:给大家推荐一个C#开发可以用到的界面组件——DevExpress WinForms,它能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

点击获取DevExpress v23.1正式版(Q技术交流:909157416)

一、申请单填写

在我们提交申请前,我们一般是需要填写一些相关的资料,如下界面所示。

WinForm应用实战开发指南

这个表单记录的信息不多,不过提供存为草稿的功能也是要的,我们所有申请单都提供这个标准功能。

或者复杂一点的申请单:

WinForm应用实战开发指南

以往做过草稿保存,把记录复制在正式的申请单里面,设置它为草稿状态即可,这种方式可以实现,不过不好统一处理,本篇随笔介绍的是所有草稿存储在一个表里面,我们定义一些字段用来存储对应信息的JSON数据,然后需要的时候,把它们逐一解析为对应的对象即可,这种我们可以在基类窗体里面封装它的【存为草稿】的逻辑处理了。

二、草稿功能实现

首先我们定义一个存储草稿信息,可以对单表,也可以对主从表的数据,我们把它存储为对应的JSON字段即可,设计草稿的数据表如下所示。

WinForm应用实战开发指南

在申请单填写的基类窗体里面,我们定义界面如下所示。

WinForm应用实战开发指南

然后我们在基类提供一个通用的业务草稿保存处理函数,供子类进行调用即可。

/// <summary>
/// 保存草稿
/// </summary>
/// <param name="title">草稿标题</param>
/// <param name="mainJson">主业务表单数据</param>
/// <param name="detailJson">从表业务表单数据(如无则为null)</param>
/// <param name="detailJson2">从表业务表单数据(如无则为null)</param>
/// <param name="detailJson3">从表业务表单数据(如无则为null)</param>
/// <returns></returns>
protected virtual void SaveDraft(string title, string mainJson, string detailJson = null,
string detailJson2 = null, string detailJson3 = null)
{
var formInfo = BLLFactory<BLL.Form>.Instance.FindByID(this.FormID);
ArgumentCheck.Begin().NotNull(formInfo, "表单对象");var infoDraft = new ApplyDraftInfo();
if(!string.IsNullOrEmpty(this.DraftId))
{
infoDraft.ID = this.DraftId;//如果已有的则更新
}
infoDraft.BizDraftJson = mainJson;
infoDraft.BizDraftJson2 = detailJson;
infoDraft.BizDraftJson3 = detailJson2;
infoDraft.BizDraftJson4 = detailJson3;
infoDraft.Form_ID = this.FormID;
infoDraft.FormName = formInfo.FormName;
infoDraft.Category = formInfo.Category;
infoDraft.Title = title;
infoDraft.Creator = LoginUserInfo.ID;
infoDraft.CreateTime = DateTime.Now;
var flag = BLLFactory<ApplyDraft>.Instance.InsertUpdate(infoDraft, infoDraft.ID);MessageDxUtil.ShowTips("保存草稿-" + (flag ? "成功" : "失败"));
if (flag)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
}

我们可以看到,草稿可以新增或者更新,如果对于已经存在的草稿,我们再次编辑的时候,不会新增另外一条记录,而是修改原来的记录。

对于普通单表的申请单处理,如下界面所示。

WinForm应用实战开发指南

那么它的保存草稿的功能代码是如何实现的?

/// <summary>
/// 保存草稿处理
/// </summary>
private void btnSaveDraft_Click(object sender, EventArgs e)
{
string title = string.Format("{0}的付款申请单【{1}】(草稿)", LoginUserInfo.FullName, DateTime.Now.ToShortDateString());var info = tempInfo;//必须使用存在的局部变量,因为部分信息可能被附件使用
SetInfo(info);
info.Creator = base.LoginUserInfo.ID;
info.CreateTime = DateTime.Now;//保存草稿:对象信息转换为JSON进行保存
SaveDraft(title, info.ToJson());
}

这里保存实际上就是获取对应的表单信息转换为JSON存储即可。

例如对于费用及费用明细的报销处理界面,如下所示。

WinForm应用实战开发指南

那么我们的草稿处理有什么不同呢?

在填写申请单的子类我们实现按钮【存为草稿】的单击事件处理,代码如下所示。

/// <summary>
/// 保存申请单草稿的处理
/// </summary>
private void btnSaveDraft_Click(object sender, EventArgs e)
{
string title = string.Format("{0}的{1}报销申请单【{2}】(草稿)", LoginUserInfo.FullName, this.txtCategory.Text, DateTime.Now.ToShortDateString());
var info = tempInfo;//必须使用存在的局部变量,因为部分信息可能被附件使用
SetInfo(info);
info.Creator = base.LoginUserInfo.ID;
info.CreateTime = DateTime.Now;//获取费用明细
var list = GetDetailList();//保存草稿处理:如果有多个明细,可以增加在后面
SaveDraft(title, info.ToJson(), list.ToJson());
}

我们这里需要把费用信息、明细信息的对象转换为JSON对象,然后统一调用基类的保存草稿函数即可。

而对于草稿信息加载,还原为实际表单的信息显示,我们处理代码就是先解析JSON对象,转换为实际表单对象,然后进行界面赋值展示即可,如下代码所示。

WinForm应用实战开发指南

完成这些,我们就可以在实际申请单业务中进行草稿的存储和显示了。

WinForm应用实战开发指南

三、界面代码生成

以上代码相对都比较简单,不过我们为了开发工作流模块更加高效,统一使用代码生成工具Database2Sharp进行界面的代码生成即可,同时保存草稿、附件处理等代码都一并生成,直接使用即可。

WinForm应用实战开发指南

对于主从表表的界面,我们依旧也可以使用代码生成工具进行快速的工作流界面生成。

WinForm应用实战开发指南

本文转载自:博客园 - 伍华聪

这篇关于WinForm应用实战开发指南 - 如何开发工作流模块的申请单草稿?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628717

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换