成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何設計一個編輯窗體的基類

開發
我們發現對于編輯窗體而言,它們的工作基本的流程是大同小異,而且編輯窗體中每次都需要增加按鍵處理、是否有編輯內容未保存等提示,因此我們需要一個基類來把這些基本的事情完成。

為什么我們需要一個編輯的基類呢?

我們發現對于編輯窗體而言,它們的工作基本的流程是大同小異,而且編輯窗體中每次都需要增加按鍵處理、是否有編輯內容未保存等提示,因此我們需要一個基類來把這些基本的事情完成。

下面,我們看看是如何實現這個基類的。

通用界面與基本的流程

通用的界面

我們的編輯界面通常是在一個列表界面中,通過點擊添加或者編輯按鈕,打開一個編輯窗體,他們通常長成下面的這個樣子:

基本的流程

我們總結一下基本的流程是下面這樣的:

基類的基本實現

構造函數

 

  1. public EditFormBase(){    ModelBound = false;    _skipDefaultProcessCmdKey = false;    AutoRename = true
  2.     InitializeComponent();    Activated += EditFormBase_Activated;    StartPosition = FormStartPosition.CenterScreen;} 
  3. public EditFormBase(IListFormBase listFrm)    : this(){    ListForm = listFrm;} 
  4.  
  5. 其要點如下: 
  • ModelBound:在窗體編輯時有效,知識是否加載了數據庫中的Model,因為很多時候,我們的控件是有相關聯動而產生另外的數據的,有時候在數據綁定的時候并不想要產生這些事件,這個時候這個屬性就非常有用。比如收款金額,可能是**體積單價*體積**,但是也可能是錄單人員手動輸入的,這個時候,我們保存的內容包括:體積單價、體積、收款金額;而編輯的時候,這個自動計算的功能是不需要的。

  • _skipDefaultProcessCmdKey:是否忽略現有的鍵盤按鍵的操作。基類中我重寫了鍵盤按鍵事件,按ESC關閉窗體,按Enter提交表單。

  • AutoRename:是否允許基類自動對窗體進行命名。假設實現類中的Title寫為“發貨單”,那么,新增時基類自動命名為“新增發貨單”;編輯時自動命名為“編輯發貨單”。

  • EditFormBase_Activated:在這個事件中才處理Model的綁定,這樣可以確保Model的綁定在Form_Load事件之后。

  • IListFormBase listFrm:列表界面接口。這個接口要求列表界面對列表數據進行刷新,這樣,我們在編輯和更新時候,就可以同時更新列表的數據了。因此,列表窗體必須實現這個接口。

窗體加載與激活

  1. ///窗體加載 
  2. private void EditFormBase_Load(object sender, EventArgs e) 
  3.     if (IsEdit) 
  4.     { 
  5.         if (AutoRename) 
  6.             Text = "編輯" + Text; 
  7.     } 
  8.     else 
  9.     { 
  10.         ModelBound = true
  11.         if (AutoRename) 
  12.             Text = "添加" + Text; 
  13.     } 
  14. ///窗體激活 
  15. private void EditFormBase_Activated(object sender, EventArgs e) 
  16.     if (!FormLoaded) 
  17.     { 
  18.         if (IsEdit) 
  19.         { 
  20.             BindEntity(); 
  21.             ModelBound = true
  22.             AfterBindEntity(); 
  23.         } 
  24.         FormLoaded = true
  25.     } 

提交表單

  1. //提交操作,一般在點擊按鈕之后觸發 
  2. protected void ReadySaveEntity(bool close) 
  3.     if (CheckInput()) 
  4.     { 
  5.         Cursor = Cursors.WaitCursor; 
  6.         string operation = IsEdit ? "編輯" : "添加"
  7.         try 
  8.         { 
  9.             if (SaveOrUpdateEntity(IsEdit)) 
  10.             { 
  11.                 MessageBoxHelper.ShowTipsSlide("{0}成功!!!", operation); 
  12.                 RefreshUi(); 
  13.                 if (close) 
  14.                 { 
  15.                     DialogResult = DialogResult.OK; 
  16.                     Close(); 
  17.                 } 
  18.                 else 
  19.                 { 
  20.                     ClearScreen(); 
  21.                 } 
  22.             } 
  23.         } 
  24.         catch (Exception ex) 
  25.         { 
  26.             OnSaveOrUpdateError(ex, operation); 
  27.         } 
  28.         finally 
  29.         { 
  30.             Cursor = Cursors.Default; 
  31.         } 
  32.     } 
  33.  
  34. //實際的提交,是一個虛方法,需要子類實現,沒有實現將會彈出警告框 
  35. protected virtual bool SaveOrUpdateEntity(bool isEdit) 
  36.     MessageBoxHelper.ShowTips("沒有實現添加或者編輯記錄的接口,請與開發人員聯系"); 
  37.     return false

列表更新與界面清空

  1. //都是有默認的實現,當然你可以可以自己重寫 
  2. protected virtual void RefreshUi() 
  3.     if (ListForm != null
  4.     { 
  5.         ListForm.RefreshListView(""); 
  6.     } 
  7.     else 
  8.     { 
  9.         MessageBoxHelper.ShowTips("沒有實現刷新界面的接口,請與開發人員聯系"); 
  10.     } 

數據綁定、控件驗證

  1. //都是空方法,需要子類實現 
  2. protected virtual void BindEntity() 
  3.  
  4. protected virtual void AfterBindEntity() 
  5.  

使用實例

以下面的界面為例子,我們講講如何實現這個編輯窗體

其基本實現步驟如下:

繼承基類

 

  1. public partial class SendOrderEdit : EditFormBase 
  2. public SendOrderEdit(IListFormBase list) 
  3. : base(list) 
  4. InitializeComponent(); 

 

觸發保存并新增、保存并關閉按鈕

  1. //保存并新增 
  2. private void btnSaveAndAdd_Click(object sender, EventArgs e) 
  3.     ReadySaveEntity(false); 
  4.     IsEdit = false
  5. //保存并關閉 
  6. private void btnSaveAndClose_Click(object sender, EventArgs e) 
  7.     ReadySaveEntity(true); 

實現基本的操作流程

  • 驗證CheckInput

  • 數據綁定BindEntity

  • 提交數據庫SaveOrUpdateEntity

  • 清空界面ClearScreen

  • 如果需要控制刷新列表的參數,需要重寫刷新方法RefreshUi

帶保存按鈕和關閉按鈕的基類

為了更簡化我們的操作和統一編輯界面,我們同時提供了下面這個編輯窗體基類,是帶有保存按鈕和關閉按鈕的:

它的實現非常簡單:

 

  1. public partial class BaseFormEditNew : EditFormBase 
  2.     public BaseFormEditNew() 
  3.     { 
  4.         InitializeComponent(); 
  5.     } 
  6.  
  7.     public BaseFormEditNew(IListFormBase list) 
  8.         : base(list) 
  9.     { 
  10.         InitializeComponent(); 
  11.     } 
  12.  
  13.     private void btnCancel_Click(object sender, EventArgs e) 
  14.     { 
  15.         Close(); 
  16.     } 
  17.  
  18.     private void btnSave_Click(object sender, EventArgs e) 
  19.     { 
  20.         ReadySaveEntity(true); 
  21.     } 
責任編輯:王雪燕 來源: 博客園
相關推薦

2021-05-28 18:12:51

C++設計

2009-07-24 11:29:33

WinForm表單窗體

2013-07-01 11:01:22

API設計API

2018-09-18 09:38:11

RPC遠程調用網絡通信

2020-03-26 09:36:06

AB Test平臺的流量

2024-11-20 13:18:21

2020-09-22 07:50:23

API接口業務

2024-04-24 10:38:22

2010-02-23 15:52:14

Python編輯器

2020-09-02 07:22:17

JavaScript插件框架

2022-09-13 08:01:58

短鏈服務哈希算法字符串

2023-09-08 08:10:48

2020-11-11 09:49:12

計算架構

2023-09-08 08:22:30

2024-08-27 12:49:20

2021-05-20 13:22:31

架構運維技術

2012-11-20 09:33:02

2019-11-20 23:44:29

接口數據加密數據安全

2025-01-26 09:35:45

2014-04-04 09:13:34

網絡設計網絡安全性設計網絡安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲高清一区二区三区 | 日韩成人中文字幕 | 久久成人综合 | 亚洲免费人成在线视频观看 | 久久99久久 | 国产亚洲精品综合一区 | 日韩在线观看网站 | 91久久| 日日碰碰 | 天堂视频免费 | 国产一区二区三区久久久久久久久 | 国产乱人伦精品一区二区 | 国产综合久久 | 欧产日产国产精品99 | 一区二区三区国产精品 | 日韩www | 黄色大片在线 | 国产精品美女久久久久久不卡 | 一级黄色播放 | 午夜视频一区 | 亚洲黄色一区二区三区 | 91国在线高清视频 | 91在线一区| 国产精品日韩欧美一区二区三区 | 精品视频在线一区 | 特一级黄色毛片 | 欧美精品一二三区 | 不卡一二三区 | 日韩精品av一区二区三区 | 成人中文字幕在线 | 一区二区三区中文字幕 | 国产91在线 | 欧美 | 欧美激情五月 | 久久99久久99精品免视看婷婷 | 99精品欧美一区二区三区综合在线 | 成人网视频 | 久久久久99| 亚洲一区二区三区免费在线观看 | www.日韩系列 | 欧美8一10sex性hd | 久久久精品 |