WinForm应用实战开发指南 - 如何完成工作流模块的业务表单开发?
在我们开发工作流的时候往往需要涉及到具体业务表单信息的编辑有些是采用动态编辑的有些则是在开发过程中处理的各有各的优点动态编辑的则方便维护各种各样的表单但是数据的绑定及处理则比较麻烦而自定义开发的则数据弹性很大方便修改调整。本篇随笔基于表单的开发设计过程介绍在工作流中如何新增一个业务表单以便快速的实现审批业务的上线处理。PS给大家推荐这个WinForm应用界面开发组件——DevExpress WinForms它能完美构建流畅、美观且易于使用的应用程序无论是Office风格的界面还是分析处理大批量的业务数据它都能轻松胜任DevExpress新旧版本帮助文档获取可点击这篇文章查看——《界面控件DevExpress v26.1帮助文档大全CHM版本》业务表单的基类继承首先我们来了解一下业务表单的对应关系一般创建一个业务流程处理都需要有一个具体的创建业务表单的界面以及一个查看处理表单的界面。为了方便我们尽可能减少代码编写我们需要把大多数的逻辑处理放在基类实现这样我们在新增一个业务表单的时候就可以减少很多代码编写及维护了。如对于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)) { .................... }通过上面定义的对应表单的窗体基类可以减少我们重复编码的需要我们只需要利用最有效率的生成界面然后复制代码后调整即可快速生成我们所需要的不同表单界面。每个表单我们放在一个目录上这样我们就可以很好管理它们了。业务表单的动态展示处理上面介绍了业务表单的填写、查看两个不同的窗口我们在申请单的审批界面里面统一显示不同的表单以及创建不同的业务表单界面这种动态的处理可以实现不同业务表单的创建及显示界面。如我的审批工作中表单的显示界面如下所示查看具体表单后可以动态展示不同的业务窗口界面。另外我们在创建业务表单的时候根据数据库的配置信息动态展示所有可以展示的创建入口单击相关的按钮可以动态调用创建对应的表单界面。创建流程业务表单的入口如下所示。在我的审批工作界面动态创建对应的查看表单窗体代码如下所示。/// summary /// 分页控件编辑项操作 /// /summary private void winGridViewPager1_OnEditSelected(object sender, EventArgs e) { //获取记录ID和表单ID string ID this.winGridViewPager1.gridView1.GetFocusedRowCellDisplayText(ID); string FormId string.Concat(this.winGridViewPager1.gridView1.GetFocusedRowCellValue(FormId)); if (!string.IsNullOrEmpty(ID) !string.IsNullOrEmpty(FormId)) { var formInfo BLLFactoryBLL.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(); }同理对于创建编辑界面我们也可以同样的方法动态创建相关的编辑表单界面如下代码所示。本文转载自博客园 - 伍华聪

相关新闻

学 Simulink—— 手术机器人微型空心杯电机的电流前馈解耦控制仿真

学 Simulink—— 手术机器人微型空心杯电机的电流前馈解耦控制仿真

目录 手把手教你学 Simulink —— 手术机器人微型空心杯电机的电流前馈解耦控制仿真 一、为什么手术机器人"非空心杯不可"? 1.1 手术机器人关节的极端要求 1.2 空心杯电机(Coreless / Ironless)的独特优势 1.3 为什么必须"电流前馈解耦"? 二、系…

2026/8/18 13:18:12 阅读更多 →
LRCGET 批量下载歌词教程:三分钟让整座音乐库亮出同步歌词

LRCGET 批量下载歌词教程:三分钟让整座音乐库亮出同步歌词

LRCGET 批量下载歌词教程:三分钟让整座音乐库亮出同步歌词 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 刚把两三百首珍藏歌曲拷进电脑&a…

2026/8/18 13:18:12 阅读更多 →
音量拉满也救不回的低音,其实一份文本就能调好:系统级音频均衡器 Equalizer APO 完整上手

音量拉满也救不回的低音,其实一份文本就能调好:系统级音频均衡器 Equalizer APO 完整上手

音量拉满也救不回的低音,其实一份文本就能调好:系统级音频均衡器 Equalizer APO 完整上手 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 深夜一点,电影看到高潮&…

2026/8/18 13:18:12 阅读更多 →

最新新闻

手把手玩转LiquidBounce战斗模块:KillAura与CrystalAura完整配置避坑指南

手把手玩转LiquidBounce战斗模块:KillAura与CrystalAura完整配置避坑指南

手把手玩转LiquidBounce战斗模块:KillAura与CrystalAura完整配置避坑指南 【免费下载链接】LiquidBounce A free Minecraft hacked client (utility mod) for Fabric 项目地址: https://gitcode.com/gh_mirrors/li/LiquidBounce 如果你在Minecraft PVP里总是…

2026/8/18 14:45:15 阅读更多 →
数据采集卡从入门到精通(26):热电偶温度采集——塞贝克效应、冷端补偿与线性化

数据采集卡从入门到精通(26):热电偶温度采集——塞贝克效应、冷端补偿与线性化

温度是工业测量第一大物理量,热电偶是温度传感器的第一大族群:便宜、皮实、量程宽(-270~1800℃)。但它也是"最难伺候"的传感器之一:μV级信号、非线性、需要冷端补偿。本文从物理原理讲到信号链设计的每一环…

2026/8/18 14:45:15 阅读更多 →
AntiDupl图片查重实操:千张照片里的重复图,三分钟全部揪出来

AntiDupl图片查重实操:千张照片里的重复图,三分钟全部揪出来

AntiDupl图片查重实操:千张照片里的重复图,三分钟全部揪出来 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你的手机相册、下载文件夹、素材库…

2026/8/18 14:45:15 阅读更多 →
2026年锯切新趋势:高效锯条与设备的完美搭配指南

2026年锯切新趋势:高效锯条与设备的完美搭配指南

随着制造业对生产效率、精度及自动化要求的不断提升,锯切技术也在不断革新。2026年的锯切行业正迎来一场深刻的变革,从材料科学到智能化制造,每一个环节都在追求更高的性能和更低的成本。本文将深入探讨高效锯条与锯切设备的完美搭配策略&…

2026/8/18 14:45:15 阅读更多 →
【单片机课程设计/毕业设计】基于 STM32/51 单片机的 MPU6050 与 DS18B20 多传感器监护终端设计 基于 STM32/51 单片机的按键可控智能跌倒预警与照明设备设(021203)

【单片机课程设计/毕业设计】基于 STM32/51 单片机的 MPU6050 与 DS18B20 多传感器监护终端设计 基于 STM32/51 单片机的按键可控智能跌倒预警与照明设备设(021203)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/18 14:45:15 阅读更多 →
RVC变声器保姆级上手实录:10分钟语音数据,练出属于你的AI声音分身

RVC变声器保姆级上手实录:10分钟语音数据,练出属于你的AI声音分身

RVC变声器保姆级上手实录&#xff1a;10分钟语音数据&#xff0c;练出属于你的AI声音分身 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retriev…

2026/8/18 14:44:13 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图&#xff1a;用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手&#xff1a;7个字重免费商用&#xff0c;从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻&#xff1a;设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南&#xff1a;GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →