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

相关文章

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

SQL Server数据库迁移到MySQL的完整指南

《SQLServer数据库迁移到MySQL的完整指南》在企业应用开发中,数据库迁移是一个常见的需求,随着业务的发展,企业可能会从SQLServer转向MySQL,原因可能是成本、性能、跨平台兼容性等... 目录一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据二、迁移工具的选择2.1

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

在 Windows 上安装 DeepSeek 的完整指南(最新推荐)

《在Windows上安装DeepSeek的完整指南(最新推荐)》在Windows上安装DeepSeek的完整指南,包括下载和安装Ollama、下载DeepSeekRXNUMX模型、运行Deep... 目录在www.chinasem.cn Windows 上安装 DeepSeek 的完整指南步骤 1:下载并安装

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件