为什么我们需要编辑的基类?我们发现对于编辑表单,他们的基本工作流程是相似的,每次编辑表单都需要添加提示,比如按钮处理,是否有未保存的编辑内容等等,所以我们需要一个基类来整合这些基本的事情已经完成。接下来,让我们看看如何实现这个基类。常用界面及基本流程常用界面我们的编辑界面通常是一个列表界面,通过点击添加或编辑按钮,打开一个编辑窗口,它们通常是这样的:基本流程我们总结一下基本流程如下:基类构造函数的基本实现listFrm;}它的要点如下:ModelBound:在编辑窗体时有效,知道是否加载了数据库中的Model,因为很多时候我们的控件都有相关的链接来生成额外的数据,有当你不想在数据绑定的时候产生这些事件,这个时候这个属性就非常有用了。例如,收款金额可以是**卷单价*卷**,但也可以由记录员手动录入。此时我们保存的内容包括:体积单价、体积、收藏金额;编辑时,不需要这个自动计算功能。_skipDefaultProcessCmdKey:是否忽略现有键盘按键的操作。在基类中,我重写了键盘按键事件,按ESC关闭表单,回车提交表单。AutoRename:是否允许基类自动命名窗体。假设实现类中Title写成“Invoice”,则新的时间基类自动命名为“AddInvoice”;编辑时自动命名为“编辑发票”。EditFormBase_Activated:Model的绑定只在该事件中处理,保证Model的绑定在Form_Load事件之后。IListFormBaselistFrm:列表界面接口。该接口需要列表接口刷新列表数据,这样我们在编辑更新的时候,可以同时更新列表数据。因此,列表表单必须实现这个接口。表单加载和激活///表单加载privatevoidEditFormBase_Load(objectsender,EventArgse){if(IsEdit){if(AutoRename)Text="Edit"+Text;}else{ModelBound=true;if(AutoRename)Text="Add"+Text;}}///表单激活privatevoidEditFormBase_Activated(objectsender,EventArgse){if(!FormLoaded){if(IsEdit){BindEntity();ModelBound=true;AfterBindEntity();}FormLoaded=true;}}提交表单//提交操作,一般是点击按钮后触发{MessageBoxHelper.ShowTipsSlide("{0}SUCCESS!!!",operation);RefreshUi();if(close){DialogResult=DialogResult.OK;Close();}else{ClearScreen();}}}catch(Exceptionex){OnSaveOrUpdateError(ex,operation);}finally{Cursor=Cursors.Default;}}}//实际提交是虚方法,需要子类实现。如果不执行,会弹出一个警告框。protectedvirtualboolSaveOrUpdateEntity(boolisEdit){MessageBoxHelper.ShowTips("未实现添加或编辑记录的接口,请联系开发者");返回假;}列表更新和界面清空//都有默认实现,当然你可以自己做重写protectedvirtualvoidRefreshUi(){if(ListForm!=null){ListForm.RefreshListView("");}else{MessageBoxHelper.ShowTips("没有界面需要刷新界面,请联系开发者");}}数据绑定,控件验证//都是空方法,子类需要实现protectedvirtualvoidBindEntity(){}protectedvirtualvoidAfterBindEntity(){}使用示例以下面的接口为例,说说如何实现这个编辑表单。基本实现步骤如下:继承基类publicpartialclassSendOrderEdit:EditFormBase{publicSendOrderEdit(IListFormBaselist):base(list){InitializeComponent();}}触发保存并添加,保存并关闭按钮//保存并添加privatevoidbtnSaveAndAdd_Click(objectsender,EventArgse){ReadySaveEntity(false);IsEdit=false;}//保存关闭privatevoidbtnSaveAndClose_Click(objectsender,EventArgse){ReadySaveEntity(true);}实现基本操作流程验证CheckInput数据绑定BindEntity提交数据库SaveOrUpdateEntity清除接口ClearScreen如果你需要控制刷新列表的参数,需要重写Refresh方法RefreshUi带有保存按钮和关闭按钮的基类为了简化我们的操作和统一编辑界面,我们还提供了如下带有保存按钮和关闭按钮的编辑表单基类:它的实现非常简单:publicpartialclassBaseFormEditNew:EditFormBase{publicBaseFormEditNew(){InitializeComponent();}publicBaseFormEditNew(IListFormBaselist):base(list){InitializeComponent();}privatevoidbtnCancel_Click(objectsender,EventArgse){Close();}privatevoidbtnSave_Click(objectsender,EventArgse;Event){}}
