轉帖|使用教程|編輯:龔雪|2023-02-24 10:09:17.920|閱讀 287 次
概述:本文主要介紹基于表單的開發(fā)設計過程,在工作流中如何新增一個業(yè)務表單,以便快速的實現(xiàn)審批業(yè)務的上線處理。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
在我們開發(fā)工作流的時候,往往需要涉及到具體業(yè)務表單信息的編輯,有些是采用動態(tài)編輯的,有些則是在開發(fā)過程中處理的,各有各的優(yōu)點,動態(tài)編輯的則方便維護各種各樣的表單,但是數(shù)據(jù)的綁定及處理則比較麻煩,而自定義開發(fā)的,則數(shù)據(jù)彈性很大,方便修改調整。本篇隨筆基于表單的開發(fā)設計過程,介紹在工作流中如何新增一個業(yè)務表單,以便快速的實現(xiàn)審批業(yè)務的上線處理。
PS:給大家推薦這個WinForm應用界面開發(fā)組件——DevExpress WinForms,它能完美構建流暢、美觀且易于使用的應用程序,無論是Office風格的界面,還是分析處理大批量的業(yè)務數(shù)據(jù),它都能輕松勝任!
DevExpress技術交流群7:674691612 歡迎一起進群討論
首先我們來了解一下業(yè)務表單的對應關系,一般創(chuàng)建一個業(yè)務流程處理,都需要有一個具體的創(chuàng)建業(yè)務表單的界面,以及一個查看處理表單的界面。
為了方便,我們盡可能減少代碼編寫,我們需要把大多數(shù)的邏輯處理放在基類實現(xiàn),這樣我們在新增一個業(yè)務表單的時候就可以減少很多代碼編寫及維護了。
如對于FrmAddApply類定義如下,我們定義一些抽象接口用于下面的業(yè)務表單實現(xiàn):
/// <summary> /// 創(chuàng)建申請單的窗體基類 /// </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> /// 顯示數(shù)據(jù)的函數(shù)(子類必須實現(xiàn)) /// </summary> public virtual void DisplayData() { } /// <summary> /// 實現(xiàn)控件輸入檢查的函數(shù)(子類必須實現(xiàn)) /// </summary> /// <returns></returns> public virtual bool CheckInput() { return true; } /// <summary> /// 編輯狀態(tài)下的數(shù)據(jù)保存(子類必須實現(xiàn)) /// </summary> /// <returns></returns> public virtual bool SaveUpdated() { return true; } /// <summary> /// 新增狀態(tài)下的數(shù)據(jù)保存(子類必須實現(xiàn)) /// </summary> /// <returns></returns> public virtual bool SaveAddNew() { return true; } ...................
這樣我們創(chuàng)建一個新的業(yè)務表單,只需要利用代碼生成工具,生成所需要的各層框架代碼,然后再生成Winform窗體代碼,復制部分界面處理代碼過來這個業(yè)務表單的子類即可。
下面是一個請假申請的業(yè)務表單設計,如下所示。
我們看到這個表單可以使用代碼生成工具Database2Sharp快速生成后進行一定調整的,而這個編輯表單的界面,我們只需要使用自動生成的部分代碼即可。
相關代碼只需要復制上面的新增、更新、顯示數(shù)據(jù)的代碼即可。
對于查看申請單的基類FrmViewApply類,我們更加簡單,我們需要把它的自定義界面控件加載出來即可。
下面是查看申請單的基類,封裝了相關的處理邏輯。
/// <summary> /// 本窗體是通用的查看申請單界面基類。 /// 為減少開發(fā)相關頁面的工作量,只需要創(chuàng)建一個新窗體,并繼承本窗體,然后在子窗體Form_Load函數(shù)里面,初始化對應的申請單顯示控件即可。 /// </summary> public partial class FrmViewApply : BaseDock { /// <summary> /// 申請單ID /// </summary> public string ApplyId { get; set; } /// <summary> /// 申請單自定義控件 /// </summary> public BaseUserControl ApplyControl { get; set; } /// <summary> /// 默認構造函數(shù) /// </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> /// 初始化工具欄的按鈕和狀態(tài) /// </summary> protected virtual void InitToolBar() { ................//基類實現(xiàn),控制什么時候該做什么審批處理,以及一些常見按鈕 } .................
查看請假申請單的窗口就是繼承這個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這個用戶控件類里面的了,
而這個控件主要就是上面編輯請假申請單的界面設計,并復制相關的顯示數(shù)據(jù)代碼即可。
相關界面代碼如下所示。
/// <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> /// 初始化數(shù)據(jù)字典 /// </summary> private void InitDictItem() { //初始化代碼 } /// <summary> /// 數(shù)據(jù)顯示的函數(shù) /// </summary> public void DisplayData() { InitDictItem();//數(shù)據(jù)字典加載(公用) //由于申請單一般是用申請表單入口,而非業(yè)務數(shù)據(jù)表,因此只能傳入ApplyId獲取信息 if (!string.IsNullOrEmpty(ApplyId)) { .................... }
通過上面定義的對應表單的窗體基類,可以減少我們重復編碼的需要,我們只需要利用最有效率的生成界面,然后復制代碼后調整即可快速生成我們所需要的不同表單界面。
每個表單我們放在一個目錄上,這樣我們就可以很好管理它們了。
上面介紹了業(yè)務表單的填寫、查看兩個不同的窗口,我們在申請單的審批界面里面,統(tǒng)一顯示不同的表單,以及創(chuàng)建不同的業(yè)務表單界面,這種動態(tài)的處理可以實現(xiàn)不同業(yè)務表單的創(chuàng)建及顯示界面。
如我的審批工作中,表單的顯示界面如下所示,查看具體表單后,可以動態(tài)展示不同的業(yè)務窗口界面。
另外我們在創(chuàng)建業(yè)務表單的時候,根據(jù)數(shù)據(jù)庫的配置信息,動態(tài)展示所有可以展示的創(chuàng)建入口,單擊相關的按鈕,可以動態(tài)調用創(chuàng)建對應的表單界面。
創(chuàng)建流程業(yè)務表單的入口如下所示。
在我的審批工作界面,動態(tài)創(chuàng)建對應的查看表單窗體代碼如下所示。
/// <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 = BLLFactory<BLL.Form>.Instance.FindByID(FormId); if (formInfo != null && !string.IsNullOrEmpty(formInfo.ApplyWin2)) { try { //根據(jù)配置的查看窗體,動態(tài)構建查看申請單對象 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); } } } }
這個代碼替代了需要手動創(chuàng)建不同對象的處理。
var dlg = new FrmViewAssignWork(); dlg.ApplyId = ID; dlg.OnDataSaved += new EventHandler(dlg_OnDataSaved); if (DialogResult.OK == dlg.ShowDialog()) { BindData(); }
同理,對于創(chuàng)建編輯界面,我們也可以同樣的方法動態(tài)創(chuàng)建相關的編輯表單界面,如下代碼所示。
本文轉載自:
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:慧都網(wǎng)