业务单据窗体开发步骤|开发教程

目录


1.1.1 新建业务窗体








1.1.2 界面布局设计





1.1.3 数据查询页设计




1.1.4 设计主表表格












|
属性名称 |
说明 |
|
(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继承关系图


1.1.9 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.10bllSO类
|
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继承关系图


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事件中调用。

1)实例化业务层_BLL变量。
2)调用公共方法设置表格样式。
3)绑定主表表格及明细表表格的事件。
4)绑定数据参照组件(LookupEdit)的数据源。
5)加载一个空的业务对象,用于测试网络环境及初始化数据。

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方法,该方法的参数跟据查询条件定义逐个对应,常用的查询条件有【单据号码】,【日期范围】等。



1.1.14.4 绑定主表输入组件数据源(DoBindingSummaryEditor方法)
在【数据编辑】页面,主表的资料用文本框展示,重写DoBindingSummaryEditor方法自动绑定文本框的数据源。

1.1.14.5绑定明细表格的数据源(DoBindingDetailGrid方法)
重写DoBindingDetailGrid方法绑定销售订单明细表的数据源。
该方法是frmBaseBusinessForm窗体中定义的虚方法。

1.1.14.6 增加(DoAdd方法)
【销售订单】不需要实现DoAdd方法,在frmBaseBusinessForm窗体该方法调用业务层的虚方法,在派生类bllSO中重写相关方法就行。

1)调用业务层的GetDataByKey方法,下载一个空的业务单据DataSet。
2)调用业务层的NewBusiness方法,新增一条记录并初始化数据,如【单据日期】,
【制单人】等预设值。
3)绑定主表,明细表的数据源。
4)将状态改为UpdateType.Add。
5)显示详细资料页面。

1.1.14.7 删除(DoDelete方法)
【销售订单】不需要实现DoDelete方法,在frmBaseBusinessForm窗体中该方法调用业务层的Delete虚方法,在派生类bllSO中重写Delete方法就行。

1)调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据禁止删除。
2)调用BLL的Delete方法删除【销售订单】的数据。
3)如后台数据删除成功,要同步删除表格中缓存的记录。

1.1.14.8 修改(DoEdit方法)
【销售订单】不需要实现DoEdit方法,在frmBaseBusinessForm窗体中已经完成该方法的所有功能,调用BLL.GetDataByKey方法获取数据。

1)调用BLL的IsOwnerChange方法检查制单人,不能修改他人创建的单据。
2)调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据禁止修改。
3)调用DoViewContent方法显示当前单据的详细资料。
4)将状态改为UpdateType.Modify。
5)显示详细资料页面。

1.1.14.9 查看(DoViewContent方法)
【销售订单】不需要实现DoViewContent方法,在frmBaseBusinessForm窗体中该方法调用业务层的GetDataByKey虚方法,在派生类bllSO重写GetDataByKey方法就行。

1)调用业务层的GetDataByKey方法下载业务单据的数,返回DataSet。
2)绑定主表及明细表的数据源。
3)将状态改为UpdateType.None。
4)显示详细资料页面。

及bllSO. GetDataByKey
1.1.14.10 取消(DoCancel方法)
【销售订单】不需要实现DoCancel方法,在frmBaseBusinessForm窗体中已实现具体功能。

1)调用DoViewContent方法重新显示当前单据。
2)将状态改为UpdateType.None。

1.1.14.11 打印(DoPrint方法)
打开打印预览窗体。

1.1.14.12 审核(DoApproval方法)
【销售订单】不需要实现DoApproval方法,在frmBaseBusinessForm窗体中该方法调用业务层的虚方法,在业务层bllSO重写ApprovalBusiness方法就行。

a)调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据不能重复审核。
b)调用BLL的ApprovalBusiness方法审核单据。

1.1.14.13 保存(DoSave方法)

1)更新最后获得焦点输入框的数据及主表的汇总金额。
2)检查主从表的数据合法性。
3)保存本次修改日志记录。
4)数据采集:创建用于保存的临时数据。bllBaseBusiness类的_CurrentBusiness变量存储当前正在处理的业务数据,在保存前要做特殊处理,如设置【最后修改人】、【修改日期】或其他关联数据,为了不影响原始数据,复制一个副本用于保存,若保存失败也不影响当前正在处理的业务数据。
5)调用BLL.Save方法。
6)如保存成功,前台相关处理。
7)将状态改为UpdateType.None。

1.1.14.14 主表数据合法性检查(ValidatingSummaryData方法)

1.1.14.15 明细表数据合法性检查(ValidatingDetailData方法)

1.1.14.16 显示修改历史记录(DoShowModifyHistory方法)
打开frmModifyLog窗体显示修改历史记录。

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 相关文章及视频参考

1.1.16 几个标准模板窗体参考

1)【数据字典】窗体请参考《客户管理》和《产品管理》
2)【业务单据】窗体请参考【采购模块】的《采购订单》及【销售模块】的《销售订单》
C/S结构快速开发框架/软件快速开发平台CSFrameworkV5.1旗舰版原创软件@csframework.com

CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架
CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架
VS2022 .NET7 部署 DevExpress V22.2 开发包 | 开发教程
业务单据窗体基类介绍|开发教程
业务单据窗体开发实例|销售订单的表结构设计|开发教程
数据字典窗体编写窗体的代码|开发教程
数据字典窗体bllBaseDataDict类详解|开发教程
数据字典窗体BLL、DAL继承关系图|开发教程
数据字典窗开发步骤|开发教程
frmBaseDataDictionary类成员介绍|C/S开发框架|开发教程
CSFramework旗舰版V5.1 - 单表独立数据编辑窗体实例开发教程-C/S开发框架
独立数据编辑窗体(单表)实例开发教程-CSFrameworkV5.1旗舰版
CSFramework.WebApi新手入门实战开发教程(C#+VS2017)
开发框架客户端开发教程视频|C/S框架网
微信支付后台服务器返回的接口通知notify_url(回调接口设计)-C/S框架网
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服





