C/S快速开发框架旗舰版V5.1 - 业务单据窗体开发步骤
目录
业务单据窗体开发比较反正,建议使用代码生成器工具生成窗体原型,然后二次修改。
以【销售订单】窗体举例说明,窗体名称:frmSO,以下是业务单据窗体开发步骤。
1.1.1 新建业务窗体
在【销售模块】新建【frmSO】窗体。
在【销售模块】点右键,【添加】à【新建项】à打开【新建项对话框】。
【添加新项】对话框
在【名称】输入框输入【frmSO】,点【添加】按钮弹出【继承选择器】窗体。
如找不到frmBaseBusinessForm基类窗体,请点击【浏览】按钮,在debug目录内选择CSFrameworkV5.Library.dll文件,点【确定】加载类库。
选择【frmBaseBusinessForm】组件名称,点【确定】按钮。
1.1.2 界面布局设计
【数据查询页】:用于展示查询结果的数据,表格只读,不可修改。
【数据编辑页】:用于展示详细资料,用户在【数据编辑页】可以修改数据。
1.1.3 数据查询页设计
设计查询条件;
从工具箱拖放PanelControl 组件,Dock设为Top,在PanelControl内拖放一组查询条件输入框及查询按钮;
1.1.4 设计主表表格
从工具箱拖放PanelControl 组件,Dock设为Client;
在PanelControl内拖放一个GridControl组件,然后改名,如下图:
GridControl可以从其它窗体复制过来,节省开发时间。
在GridView(gvSummary)内定义表格的列。
表格的列设计页面
新增一个列
列的属性设置。主要修改(Name),Caption,FieldName三个属性。
属性名称 | 说明 |
(Name) | 列名称(列名)。建议用col+字段名命名,如:colCustomerCode |
Caption | 列的标题。如:客户编号 |
FieldName | 列对应的字段名,用于绑定数据。如字段名:CustomerCode |
关闭设计器,表格内定义了以下列:
1.1.5 数据编辑页面设计(主/从表输入区域)
一般情况下业务单据只有一个明细表,设计效果如下:
有的业务单据比较复杂,【收回委托加工单】有3个明细表,其中两个明细表用TabPage整合到一起,参考设计:
1.1.6 主表输入组件设计
输入框 (文本框)必须以txt+字段名命名,如:SONO 销售订单编号的文本框命名为txtSONO, CheckBox用缩写chk,如:chkFlagAPP审核。
1.1.7 使用代码生成器工具生成ORM、BLL、DAL代码
代码生成器可生成Model、DAL和BLL层的代码,业务单据窗体开放比较复杂,除框架实现的功能以外还需要扩展少量方法,如:【销售单据】扩展的方法有CheckNoExists,GetSummaryByParam,GetReportData等方法。
跟据业务需求进行二次开发,或者修改代码生成器生成模板代码,增强功能,提高效率。
视频下载:http://www.csframework.com/cs-code-generator.htm
1.1.8 BLL继承关系图
bllBase是所有业务层的基类,bllBaseBusiness是【业务单据】的业务逻辑层基类,所有【业务单据】的业务逻辑层从bllBaseBusiness派生,如bllPO,bllSO。
1.1.9 bllBaseBusiness类
bllBaseBusiness类是业务单据的业务逻辑层基类,实现了业务单据所需的公共方法。该类中定义的虚方法便于派生类重写。
bllBaseBusiness类说明:
ID | 名称 | 类型 | 说明 |
1 | AllowWriteLog | 标记允许写入修改日志。 | |
2 | ApprovalBusiness | 审核功能的方法。 | |
3 | BusinessTables | 对应当前业务单据的数据. DataTableCollection类型, 第1个表(Index为0)为主表,其它为明细表。 | |
4 | ClearAppInfo | 清空审核功能相关字段的数据。 | |
5 | CreateSaveData | 创建用于保存的临时数据。 | |
6 | CurrentBusiness | 当前业务单据的数据。 | |
7 | DataBinder | 对应当前单据的主表数据 (DataTable), 该表只有一条记录,用于绑定[数据修改页面]输入组件的数据源。 | |
8 | DataBindRow | DataRow类型,对应DataBinder的第一条记录。 | |
9 | Delete | 删除单据。 | |
10 | DoCreateTempData | 创建用于保存的临时数据。该方法由CreateSaveData方法调用。 | |
11 | GetAttachedFiles | 获取单据附件数据。 | |
12 | GetDataByKey | 下载指定单号的业务数据。 | |
13 | IsApproved | 检查业务单据是否审核。 | |
14 | IsOwnerChange | 比较当前登录用户与制单人是否一致。 | |
15 | KeyFieldName | 业务单据的主键字段名。 | |
16 | SummaryTableName | 业务单据的主表名称。 | |
17 | NewBusiness | 新增业务数据。 | |
18 | NotifyUser | 当单据被修改发送手机短信或Email给制单人。 | |
19 | Save | 保存业务数据。 | |
20 | SaveAttachedFile | 保存附件。 | |
21 | Update |
| 保存数据,虚方法,具体类必须重写。 |
22 | UpdateCommonFieldsValue | 更新业务单据明细表的公共字段数据。 | |
23 | WriteLog | 保存修改日志。 | |
24 | CreateAttachFileBridge |
| 创建业务单据附件管理的数据层桥接实例。 |
1.1.10 bllSO类
ID | 名称 | 类型 | 说明 |
1 | ApprovalBusiness | 重载的方法,用于审核单据。 | |
2 | CheckNoExists | 检查单据号码是否存在。 | |
3 | CreateSaveData | 重载的方法,创建用于保存的临时数据。 | |
4 | Delete | 重载的方法,删除单据。 | |
5 | FuzzySearch | 产品资料模糊查询。实现IfuzzySearchSupportable接口, 在 frmFuzzySearch窗体中使用。 | |
6 | FuzzySearchName | 模糊查询功能的名称,如:产品资料查询。在frmFuzzySearch窗体的标题显示。 | |
7 | QueryReportData | 获取报表数据。 | |
8 | GetDataByKey | 重载的方法,下载指定单号的业务数据。 | |
9 | GetSummaryByParam | 查询销售订单的主表数据,查询结果在主表格中显示。 | |
10 | NewBusiness | 重载的方法,新增业务数据。 | |
11 | Update | 重载的方法,保存数据。 |
类成员截图:
1.1.11 DAL继承关系图
上图所示,dalBase是数据访问层的基类,dalBaseBusiness是【业务单据】数据层的基类,业务单据的DAL从dalBaseBusiness类继承,如dalPO,dalSO。
1.1.12 dalBaseBusiness类
ID | 名称 | 类型 | 说明 |
1 | _ReplaceString | 提交数据前去左右空格、全角转半角,若设置此值会有性能损失! | |
2 | _SummaryKeyName | 主表主键字段名。 | |
3 | _SummaryTableName | 主表表名。 | |
4 | _UpdateSummaryKeyMode | 业务单据号码更新类型(自动生成流水号或GUID)。 | |
5 | ApprovalBusiness | 单据审核/批准功能。。 | |
6 | CheckNoExists | 检查业务数据是否存在。 | |
7 | CreateSqlGenerator | 虚方法,根据表名获取该表的ORM及对应的SQL命令生成器。 | |
8 | GetNumber | 获取单据流水号码。 | |
9 | Update | 保存数据,对应BLL.Save方法 | |
10 | UpdateDetailKey | 更新明细表的外键。 | |
11 | UpdateSummaryKey | 更新主表主键。 |
类成员截图:
1.1.13 dalSO类
ID | 名称 | 类型 | 说明 |
1 | CreateSqlGenerator | 重载的方法,根据表名获取该表的ORM及对应的SQL命令生成器。 | |
2 | Delete | 删除单据,开发框架的模板窗体仅删除明细表,将主表数字类型的字段清零,如金额,数量等关键字段,保留主表的记录避免断号。 | |
3 | GetDataByKey | 获取一张业务单据的数据。 | |
4 | GetNumber | 获取单据流水号码, 首先在sys_DocSN表设置单据的超始号。 | |
5 | QueryReportData | 根据查询条件获取报表数据。 |
类成员截图:
1.1.14 编写窗体的代码
完成界面布局设计,使用【代码生成器】工具生成ORM,BLL,DAL层的代码,针对需求调整代码二次开发。开发框架提供两种数据窗体模板,为了提高开放效率,可以复制frmSO或frmPO窗体中相关代码。
窗体与业务逻辑层的引用关系:
作为标准三层开发框架,用户界面与业务逻辑代码相互分离,业务逻辑相关数据处理的代码建议封装到业务层,这样减少用户界面的代码量,降低界面与业务层代码藕合程度。
1.1.14.1 初始化业务窗体(重写InitializeForm方法)
InitializeForm方法是frmBaseDataForm窗体中定义的虚方法,派生窗体必须在Form.Load事件中调用。
InitializeForm方法主要功能:
1) 实例化业务层_BLL变量。
2) 调用公共方法设置表格样式。
3) 绑定主表表格及明细表表格的事件。
4) 绑定数据参照组件(LookupEdit)的数据源。
5) 加载一个空的业务对象,用于测试网络环境及初始化数据。
请参考frmSO. InitializeForm方法
1.1.14.2 Form.Load事件调用InitializeForm方法
private void frmSO_Load(object sender, EventArgs e)
{
this.InitializeForm(); //初始化主窗体
}
1.1.14.3 实现查询功能
实现查询功能的目的是显示主表的数据,参考frmPO.cs的btnQuery_Click时间,调用BLL层的Query方法,该方法的参数跟据查询条件定义逐个对应,常用的查询条件有【单据号码】,【日期范围】等。
流程如下:
请参考frmPO. btnQuery_Click事件以及BLL,DAL层的实现思路。
1.1.14.4 绑定主表输入组件数据源(DoBindingSummaryEditor方法)
在【数据编辑】页面,主表的资料用文本框展示,重写DoBindingSummaryEditor方法自动绑定文本框的数据源。
请参考frmPO. DoBindingSummaryEditor方法
1.1.14.5绑定明细表格的数据源(DoBindingDetailGrid方法)
重写DoBindingDetailGrid方法绑定销售订单明细表的数据源。
该方法是frmBaseBusinessForm窗体中定义的虚方法。
请参考frmPO. DoBindingDetailGrid方法
1.1.14.6 增加(DoAdd方法)
【销售订单】不需要实现DoAdd方法,在frmBaseBusinessForm窗体该方法调用业务层的虚方法,在派生类bllSO中重写相关方法就行。
【销售订单】的新增功能处理流程:
1) 调用业务层的GetDataByKey方法,下载一个空的业务单据DataSet。
2) 调用业务层的NewBusiness方法,新增一条记录并初始化数据,如【单据日期】,
【制单人】等预设值。
3) 绑定主表,明细表的数据源。
4) 将状态改为UpdateType.Add。
5) 显示详细资料页面。
请参考frmBaseBusinessForm. DoBindingDetailGrid方法及bllSO. GetDataByKey, NewBusiness
1.1.14.7 删除(DoDelete方法)
【销售订单】不需要实现DoDelete方法,在frmBaseBusinessForm窗体中该方法调用业务层的Delete虚方法,在派生类bllSO中重写Delete方法就行。
【销售订单】删除功能处理流程:
1) 调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据禁止删除。
2) 调用BLL的Delete方法删除【销售订单】的数据。
3) 如后台数据删除成功,要同步删除表格中缓存的记录。
请参考frmBaseBusinessForm. DoDelete方法及bllSO. IsApproved, Delete
1.1.14.8 修改(DoEdit方法)
【销售订单】不需要实现DoEdit方法,在frmBaseBusinessForm窗体中已经完成该方法的所有功能,调用BLL.GetDataByKey方法获取数据。
【销售订单】的修改功能处理流程:
1) 调用BLL的IsOwnerChange方法检查制单人,不能修改他人创建的单据。
2) 调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据禁止修改。
3) 调用DoViewContent方法显示当前单据的详细资料。
4) 将状态改为UpdateType.Modify。
5) 显示详细资料页面。
请参考frmBaseBusinessForm. DoEdit方法 及bllSO. IsApproved, IsOwnerChange
1.1.14.9 查看(DoViewContent方法)
【销售订单】不需要实现DoViewContent方法,在frmBaseBusinessForm窗体中该方法调用业务层的GetDataByKey虚方法,在派生类bllSO重写GetDataByKey方法就行。
【销售订单】的查看功能处理流程:
1) 调用业务层的GetDataByKey方法下载业务单据的数,返回DataSet。
2) 绑定主表及明细表的数据源。
3) 将状态改为UpdateType.None。
4) 显示详细资料页面。
请参考frmBaseBusinessForm. DoViewContent方法
及bllSO. GetDataByKey
1.1.14.10 取消(DoCancel方法)
【销售订单】不需要实现DoCancel方法,在frmBaseBusinessForm窗体中已实现具体功能。
【销售订单】的取消功能处理流程:
1) 调用DoViewContent方法重新显示当前单据。
2) 将状态改为UpdateType.None。
请参考frmBaseBusinessForm. DoCancel方法
1.1.14.11 打印(DoPrint方法)
打开打印预览窗体。
请参考frmSO. DoPrint方法
1.1.14.12 审核(DoApproval方法)
【销售订单】不需要实现DoApproval方法,在frmBaseBusinessForm窗体中该方法调用业务层的虚方法,在业务层bllSO重写ApprovalBusiness方法就行。
【销售订单】的审核功能处理流程:
a) 调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据不能重复审核。
b) 调用BLL的ApprovalBusiness方法审核单据。
请参考frmBaseBusinessForm. DoApproval方法及bllSO. ApprovalBusiness
1.1.14.13 保存(DoSave方法)
【销售订单】保存功能流程:
1) 更新最后获得焦点输入框的数据及主表的汇总金额。
2) 检查主从表的数据合法性。
3) 保存本次修改日志记录。
4) 数据采集:创建用于保存的临时数据。 bllBaseBusiness类的_CurrentBusiness变量存储当前正在处理的业务数据,在保存前要做特殊处理,如设置【最后修改人】、【修改日期】或其他关联数据,为了不影响原始数据,复制一个副本用于保存,若保存失败也不影响当前正在处理的业务数据。
5) 调用BLL.Save方法。
6) 如保存成功,前台相关处理。
7) 将状态改为UpdateType.None。
请参考frmSO. DoSave方法及bllSO. Save
1.1.14.14 主表数据合法性检查(ValidatingSummaryData方法)
请参考frmSO. ValidatingSummaryData方法
1.1.14.15 明细表数据合法性检查(ValidatingDetailData方法)
请参考frmSO. ValidatingDetailData方法
1.1.14.16 显示修改历史记录(DoShowModifyHistory方法)
打开frmModifyLog窗体显示修改历史记录。
请参考frmSO. DoShowModifyHistory方法
1.1.14.17 其它细节处理
ID | 名称 | 类型 | 说明 |
1 | ButtonAuthorized |
| frmBaseChild窗体中定义的虚方法。派生类通过重写该方法可以检查按钮的权限并隐藏工具栏的按钮。 |
2 | ButtonStateChanged |
| frmBaseDataForm窗体中定义的虚方法。当按钮状态发生变化时调用,可以重写此事件禁用某些输入组件。 |
3 | CreateOneDetail |
| 创建一条明细记录,适用于有明细表的业务窗体。此方法由 OnEmbeddedNavigatorButtonClick事件调用。
明细表格的导航按钮新增了三个自定义按钮,如下图:
分别是新增,插入,删除。在InitializeForm方法中调用 DevStyle.SetGridControlLayout(gcDetail, true)方法创建3个按钮,但必须将第2个参数allowEdit为true。
CreateOneDetail方法的buttonIndex参数对应按钮的序号,分别为0:Add,1:Insert,2:Delete,在枚举类型DetailButtons中定义。
插入记录功能需要定义Queue字段,带符号的数字类型,用于排序。
|
4 | OnCellValueChanged |
| 明细表格的OnCellValueChanged事件,当用户修改明细表单元格的数据时触发该事件。可以在此事件内计算总金额(金额=单价*数量) |
5 | OnStockCode_ButtonClick |
| 明细表的货品列支持选择功能,将列设置为ButtonEdit类型。
运行效果图如下:
点ButtonEdit的按钮触发OnStockCode_ButtonClick事件。 在InitializeForm方法中绑定OnStockCode_ButtonClick事件。 |
6 | OnStockCode_Validating |
| 用户可以选择或输入货品编码,当用户输入货品编码后离开当前单元格时触发OnStockCode_Validating事件。
在InitializeForm方法中绑定OnStockCode_Validating事件。 |
7 | SearchStockCallBack |
| 跟据货品编号获取货品详细资料,该方法由 OnStockCode_ButtonClick和OnStockCode_Validating事件调用。 |
8 | SetDetailEditorsAccessable |
| 在frmBaseDataForm窗体中定义的虚方法,用于控制明细页面上的控件可被编辑,同时禁用或启用明细表三个自定义按钮。 |
9 | UpdateDetailAmount |
| 自动计算明细表的金额合计,在OnCellValueChanged事件中调用。 |
10 | UpdateTotalAmount |
| 自动计算主表的总金额。 主表的总金额=SUM(明细表的金额)。 通常在保存前会重新计算主表的总金额。 |
1.1.15 相关文章及视频参考
视频下载:http://www.csframework.com/cs-code-generator.htm
1.1.16 几个标准模板窗体参考
开发框架内提供了几个标准数据模板窗体:
1) 【数据字典】窗体请参考《客户管理》和《产品管理》
2) 【业务单据】窗体请参考【采购模块】的《采购订单》及【销售模块】的《销售订单》
C/S结构快速开发框架/软件快速开发平台
CSFrameworkV5.1旗舰版
原创软件@csframework.com