Winform開發框架中工作流模塊的業務表單開發

在我們開發工作流的時候,往往需要設計到具體業務表單信息的編輯,有些是采用動態編輯的,有些則是在開發過程中處理的,各有各的優點,動態編輯的則方便維護各種各樣的表單,但是數據的綁定及處理則比較麻煩,而自定義開發的,則數據彈性很大,方便修改調整。本篇隨筆基于表單的開發設計過程,介紹在工作流中如何新增一個業務表單,以便快速的實現審批業務的上線處理。

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)?

?

轉載于:https://www.cnblogs.com/wuhuacong/p/7765923.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/251612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript --- 跨瀏覽器的事件處理程序

var EventUtil {addHandler: function(element, type, handler) { // 添加事件處理程序if (element.addEventListener) { // DOM2級事件處理程序element.addEventListener (type, handler, false) ;} else if (element.attachEvent) { // IE事件處理程序element.attachEve…

RabbitMQ學習總結(2)——安裝、配置與監控

2019獨角獸企業重金招聘Python工程師標準>>> 一、安裝 1、安裝Erlang 1&#xff09;系統編譯環境&#xff08;這里采用linux/unix 環境&#xff09; ① 安裝環境 虛擬機&#xff1a;VMware Workstation 10.0.1 build Linux系統&#xff1a;CentOS6.5 rabbitMQ官網下…

nginx針對某個url限制ip訪問,常用于后臺訪問限制

nginx針對某個url限制ip訪問&#xff0c;常用于后臺訪問限制 假如我的站點后臺地址為&#xff1a; http://www.abc.net/admin.php 那么我想限制只有個別ip可以訪問后臺&#xff0c;那么需要在配置文件中增加&#xff1a;location ~ .*admin.* {allow 1.1.1.1;allow 12.12.12.0/…

JavaScript --- 跨瀏覽器的事件對象

var EventUtil{addHandler: function(element, type, handler){ // 添加事件方法if (element.addEventListener){element.addEventListener(type, handler, false); // 添加監聽事件,第3個參數false代表:冒泡階段} else if (element.attachEvent) {element.attachEvent("…

第一個C#程序

第一個C#程序 新建項目-選擇模板--控制臺應用程序 還不會用學習版執行程序,沒找到執行(不調試)菜單,調試出一堆線程狀況.用了VS旗艦版完成, 看見C#在VS中的編譯和執行時分開的,eclipse確實叫預編譯軟件,代碼寫好沒錯可以直接運行,編譯由eclipse完成, 提問:為啥VS不這樣設置?是…

XML序列化與反序列化

C#對于XML的序列化與反序列化提供了很好的支持&#xff0c;我們只需要引用System.Xml的命名空間即可&#xff0c;無需使用第三方庫&#xff0c;下面簡單實現了一個XML的序列化與反序列化的幫助類。 1.序列化&#xff1a; 先聲明一個變量var settings new XmlWriterSettings&am…

CODE[VS] 3411 洪水

題目描述 Description小浣熊松松和朋友到野外露營&#xff0c;沒想到遇上了&pi;年一次的大洪水&#xff0c;好在松松是一只愛觀察的小浣熊&#xff0c;他發現露營地的地形和洪水有如下性質&#xff1a; ①露營地可以被看做是一個N*M的矩形方陣&#xff0c;其中左上角坐標為…

JavaScript --- 取得鼠標事件的坐標

說明: clientX和clientY屬性&#xff1a;事件發生時,鼠標指針在視口中的水平和垂直坐標。pageX和pageY屬性&#xff1a;鼠標光標在頁面中的位置。screenX和screenY屬性&#xff1a;鼠標事件發生時&#xff0c;鼠標指針相對于整個屏幕的坐標信息。IE8及更早的版本不支持事件對象…

JavaScript語義基礎

變量&#xff08;Variables&#xff09; Variables是你存儲數據的容器。聲明一個變量需要使用關鍵字var&#xff0c;然后輸入變量的名稱。 1 var myvar; 定義一個變量后&#xff0c;可以賦予變量一個值&#xff1a; 1 myvar "mxp"; 可以將上述操作寫在一行&#x…

spring面試專題一點通,再也不用擔心面試不會回答了

前言文章內容有點小長&#xff0c;希望你能耐心閱讀&#xff0c;更多Java面試題以及學習資料獲取方式&#xff1a;加Qun:1017-599-436免費獲取。還有更多包括電子書&#xff0c;PDF文檔以及視頻精講可以分享給大家&#xff0c;內容覆蓋很廣&#xff0c;分布式緩存、RPC 調用、Z…

bzoj4033 [HAOI2015]樹上染色

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4033 重要的思路&#xff1a;與其考慮每一個點對的貢獻&#xff0c;不如考慮每條邊的貢獻&#xff08;被經過了幾次&#xff09;&#xff01; 樹形dp。 總共的黑點和白點的個數都是已知的&#xff0c;所以知…

JavaScript --- 表單focus,blur,change事件的實現

假設有一個文本框&#xff0c;我們只允許用戶輸入數值。為此&#xff0c;我們希望: 1.利用focus事件修改文本框內容&#xff0c; 2.利用blur事件回復文本框的內容, 3.利用change事件在用戶輸入了非數值字符時再次修改背景顏色。 var EventUtil {addHandler: function(element…

mysql日期格式轉化

select DATE_FORMAT( 20170701, %Y-%m-%d);先挖坑轉載于:https://www.cnblogs.com/tuhooo/p/7766221.html

Solr管理頁面 上

DashBoard&#xff08;儀表盤&#xff09;Logging&#xff08;日志&#xff09;Core Admin&#xff08;Core管理&#xff09;在Solr中&#xff0c;每一個Core&#xff0c;代表一個索引庫&#xff0c;里面包含索引數據及其配置信息。Solr中可以擁有多個Core&#xff0c;也就同時…

GRPC協議的相關原理

GRPC的Client與Server&#xff0c;均通過Netty Channel作為數據通信&#xff0c;序列化、反序列化則使用Protobuf&#xff0c;每個請求都將被封裝成HTTP2的Stream&#xff0c;在整個生命周期中&#xff0c;客戶端Channel應該保持長連接&#xff0c;而不是每次調用重新創建Chann…

Echarts --- 各個省份的坐標

純手打…效果如下 1.新疆: [86.61 , 40.79] 2.西藏:[89.13 , 30.66] 3.黑龍江:[128.34 , 47.05] 4.吉林:[126.32 , 43.38] 5.遼寧:[123.42 , 41.29] 6.內蒙古:[112.17 , 42.81] 7.北京:[116.40 , 40.40 ] 8.寧夏:[106.27 , 36.76] 9.山西:[111.95,37.65] 10.河北:[115.21 , 38.…

xxx征集系統項目目標文檔

問題 每四人一組&#xff0c;討論結束后&#xff0c;每人根據課堂討論結果提交一份系統利益相關者案例。撰寫撰寫項目目標文檔&#xff08;目標&#xff0c;好處&#xff0c;度量標準。&#xff09; 項目目標文檔 目標&#xff1a; &#xff08;1&#xff09;需求填報 &#xf…

高并發大流量專題---10、MySQL數據庫層的優化

高并發大流量專題---10、MySQL數據庫層的優化 一、總結 一句話總結&#xff1a; mysql先考慮做分布式緩存&#xff0c;過了緩存后就做mysql數據庫層面的優化 1、mysql數據庫層的優化的前面一層是什么&#xff1f; 數據庫緩存&#xff1a;突破了數據庫緩存就需要做mysql數據庫層…

【彩彩只能變身隊】后端工作總結

2018.06.09 早上8點到晚上10點 沖刺前后端交互(vueexpressmysql) 8&#xff1a;00-12&#xff1a;00 &#xff1a; 前端把請求寫好&#xff1a; <template> <div class"LoginForm"> <el-form ref"form" label-width"80px"…

web安全

web安全 DOS命令 web攻防必備課筆記 慕課xss學習 阮一峰&#xff1a;MVC、MVP和MVVM的圖示轉載于:https://www.cnblogs.com/hanxuming/p/7774092.html