强类型DynamicObject代码生成器

DynamicObject是一个类似Dictionary的结构。实际使用过程中,需牢记Key,同时还需频繁进行类型转换,十分麻烦。 通过本工具,可以为表单创建一个强类型的DynamicObjectView代码,引用进工程后,可以把DynamicObject转换为该类。 利用VS的智能提示,可以方便的编写代码,不用在记字段名。

优点:

  1. 无需记住字段名称,VS可通过输入点号(.)自动带出,杜绝打错字的可能
  2. 基本不可能有人能完整记住这些字段名,导致每次用的时候都要去查找字段名,浪费时间
  3. 无需类型转换。鼠标放到字段上即可显示数据类型(典型如多语言字段,很多时候忘了去取中文)
  4. 能及时预防一些潜在Bug(重点点名物料,物料由于字段众多,不同字段存放于不同实体,读取时先读取实体再读取字段,很容易导致问题)

缺点:

  1. 表单字段新增修改后,需重新生成(不重新生成不影响使用,只是新增字段需用原方法读取)

 

使用方法:

  1. 输入表单ID,点击生成。
  2. 将代码放到VS项目中,修改命名空间即可。默认类名为FormId+View
  3. 在具体代码处将DynamicObject转换为生成类:var dyo=(FormIdView)dynamicObject;

 

使用后效果对比:

 

 

 

BillView简介

有时候,我们通过后台代码新建表单时,如果直接操作数据包,表单插件、值更新事件等与视图有关的功能无法使用。

为了解决这种情况,我们可以构建一个BillView,利用此对象操作数据,比直接操作数据包有如下优势:

  1. 视图会自动触发插件,这样逻辑更加完整;
  2. 视图会自动利用单据元数据,填写字段默认值,不用担心字段值不符合逻辑;
  3. 字段改动,会触发实体服务规则;

为了便于使用,封装了个类,供大家使用。

BillViewService 代码

 

using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Metadata.FormElement; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using System; namespace SuyanaProject.Services { public class BillViewService { private Context Context; private IBillView billView; public BillViewService(Context ctx,string formId) { Context = ctx; Create(formId); } public BillViewService(Context ctx, FormMetadata meta) { Context = ctx; Create(meta); } #region 属性 /// <summary> /// 获取表单数据包 /// </summary> public DynamicObject DataObject => billView.Model.DataObject; /// <summary> /// 获取表单Model /// </summary> public IBillModel Model => billView.Model; /// <summary> /// 获取表单视图 /// </summary> public IBillView BillView => billView; #endregion #region 新建/打开表单方法 /// <summary> /// 新建表单 /// </summary> /// <returns></returns> public BillViewService New() { ((IBillViewService)billView).LoadData(); fireOnLoad(); return this; } /// <summary> /// 加载指定的单据进行修改 /// </summary> /// <param name="billView"></param> /// <param name="pkValue"></param> /// <param name="billTypeId"></param> /// <returns></returns> public BillViewService Edit(object pkValue, string billTypeId = "") { billView.OpenParameter.Status = OperationStatus.EDIT; billView.OpenParameter.CreateFrom = CreateFrom.Default; billView.OpenParameter.PkValue = pkValue; billView.OpenParameter.DefaultBillTypeId = billTypeId; ((IDynamicFormViewService)billView).LoadData(); fireOnLoad(); return this; } #endregion #region 值设置/获取方法 /// <summary> /// 设置基础资料值(按代码) /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="row"></param> /// <returns></returns> public BillViewService SetItemValueByNumber(string key, string value, int row = 0) { IDynamicFormViewService dynamicFormView = billView as IDynamicFormViewService; dynamicFormView.SetItemValueByNumber(key, value, row); return this; } /// <summary> /// 设置基础资料值(按内码) /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="row"></param> /// <returns></returns> public BillViewService SetItemValueByID(string key, object value, int row = 0) { IDynamicFormViewService dynamicFormView = billView as IDynamicFormViewService; dynamicFormView.SetItemValueByID(key, value, row); return this; } /// <summary> /// 设置普通字段值 /// </summary> /// <param name="key">唯一标识</param> /// <param name="value">值</param> /// <param name="row">行索引</param> /// <returns></returns> public BillViewService SetValue(string key, object value, int row = 0) { IDynamicFormViewService dynamicFormView = billView as IDynamicFormViewService; dynamicFormView.UpdateValue(key, row, value); return this; } /// <summary> /// 获取分录指定行的数据包 /// </summary> /// <param name="key"></param> /// <param name="row"></param> /// <returns></returns> public DynamicObject GetRowData(string key, int row) { return billView.Model.GetValue(key, row) as DynamicObject; } /// <summary> /// 为数据包设置FormId /// </summary> /// <returns></returns> public BillViewService SetFormId() { Form form = billView.BillBusinessInfo.GetForm(); form.FormIdDynamicProperty?.SetValue(billView.Model.DataObject, form.Id); return this; } #endregion #region 非公开方法 void fireOnLoad() { // 触发插件的OnLoad事件: // 组织控制基类插件,在OnLoad事件中,对主业务组织改变是否提示选项进行初始化。 // 如果不触发OnLoad事件,会导致主业务组织赋值不成功 DynamicFormViewPlugInProxy eventProxy = billView.GetService<DynamicFormViewPlugInProxy>(); eventProxy.FireOnLoad(); } void Create(string formId) { FormMetadata meta = FormMetaDataCache.GetCachedFormMetaData(this.Context, formId); Create(meta); } void Create(FormMetadata meta) { Form form = meta.BusinessInfo.GetForm(); Type type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web"); var bv = (IDynamicFormViewService)Activator.CreateInstance(type); BillOpenParameter openParam = CreateOpenParameter(meta); var provider = form.GetFormServiceProvider(); bv.Initialize(openParam, provider); billView = (IBillView)bv; } //创建视图加载参数对象,指定各种初始化视图时,需要指定的属性 private BillOpenParameter CreateOpenParameter(FormMetadata meta) { Form form = meta.BusinessInfo.GetForm(); // 指定FormId, LayoutId BillOpenParameter openParam = new BillOpenParameter(form.Id, meta.GetLayoutInfo().Id); // 数据库上下文 openParam.Context = this.Context; // 本单据模型使用的MVC框架 openParam.ServiceName = form.FormServiceName; // 随机产生一个不重复的PageId,作为视图的标识 openParam.PageId = Guid.NewGuid().ToString(); // 元数据 openParam.FormMetaData = meta; // 界面状态:新增 (修改、查看) openParam.Status = OperationStatus.ADDNEW; // 单据主键:本案例演示新建物料,不需要设置主键 openParam.PkValue = null; // 界面创建目的:普通无特殊目的 (为工作流、为下推、为复制等) openParam.CreateFrom = CreateFrom.Default; // 基础资料分组维度:基础资料允许添加多个分组字段,每个分组字段会有一个分组维度 // 具体分组维度Id,请参阅 form.FormGroups 属性 openParam.GroupId = ""; // 基础资料分组:如果需要为新建的基础资料指定所在分组,请设置此属性 openParam.ParentId = 0; // 单据类型 openParam.DefaultBillTypeId = ""; // 业务流程 openParam.DefaultBusinessFlowId = ""; // 主业务组织改变时,不用弹出提示界面 openParam.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", false); // 插件 var plugs = form.CreateFormPlugIns(); openParam.SetCustomParameter(FormConst.PlugIns, plugs); PreOpenFormEventArgs args = new PreOpenFormEventArgs(this.Context, openParam); foreach (var plug in plugs) {// 触发插件PreOpenForm事件,供插件确认是否允许打开界面 plug.PreOpenForm(args); } if (args.Cancel == true) {// 插件不允许打开界面 // 本案例不理会插件的诉求,继续.... } // 返回 return openParam; } #endregion } } 
 

使用方法

本工具类支持链式调用(如StringBuilder的Append等方法)。
具体使用方法如下:

  1. 创建实例,传入参数:Context,表单标识
  2. 调用New()或Edit(主键),创建或编辑表单
  3. 字段赋值
  4. 获取数据包,调用保存接口

以K3Cloud 简单生产领料单为例

 

 

非链式写法:

 

 

 

 

原文地址:http://www.cnblogs.com/FlyFox8753/p/16837822.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性