IDynamicFormModel接口调用示例代码
修订记录
问题和意见
如果你对文档有任何意见、问题或想法,或者你的问题未在此文档中找到答案,请通过电子邮件联系我们: liang_wu@https://www.wendangku.net/doc/c013810535.html,
IDynamicFormModel接口概要说明
IDynamicFormModel接口,对动态表单的数据模型进行管理,广泛应用于插件、操作、表单服务等需要存取表单数据的模块;
表单维护插件(AbstractDynamicFormPlugIn),属性Model指向IDynamicFormModel的接口实例;
公共属性
BillBusinessInfo
当前界面所管理的单据元数据对象。
语法
备注
对于单据维护界面,此属性就是本单的元数据;而对于列表界面来说,此属性是列表界面展示的单据元数据。
常用属性
常用方法
案例–供应链单据列表,默认按照日期、单据编号排序
代码来源
Kingdee.K3.SCM.Business.PlugIn.SCMBillList
需求背景
供应链单据,显示列表时,如果用户未明确指定排序字段,则列表将按照创建日期、单据编号、分录序号排序;
实现方案
设计一个公用列表插件,捕获PrepareFilterParameter事件,如判断出用户未设置排序字段,则到单据元数据中,尝试取单据的创建日期、单据编号、分录序号等信息,以这些字段作为排序字段。
注意,因为这是一个公用插件,需要用到BillBusinessInfo属性,动态的取创建日期、单据编号、分录序号等字段,不能直接写死字段Key,否则可能会引发字段不存在的错误。
关键字
单据元数据界面元数据去指定类型字段取创建日期字段取单据编号字段列表排序
示例代码
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using https://www.wendangku.net/doc/c013810535.html,ponentModel;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Metadata.BarElement;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.K3.Core;
using Kingdee.K3.Core.SCM;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata.EntityElement;
using https://www.wendangku.net/doc/c013810535.html,monFilter;
using Kingdee.BOS.Core.Enums;
namespace Kingdee.K3.SCM.Business.PlugIn
{
///
///供应链单据模板列表公共插件
///
[Description("供应链单据列表公共插件")]
publicclass SCMBillList : AbstractListPlugIn
{
///
///列表取数前,修改过滤条件、排序字段
///
///
publicoverridevoid PrepareFilterParameter(FilterArgs e)
{
base.PrepareFilterParameter(e);
if (string.IsNullOrWhiteSpace(e.SortString))
{
// 创建日期
Field crDateFld = this.Model.BillBusinessInfo.GetFieldList().FirstOrDefault(
p => p is CreateDateField);
// 单据编号
Field numberFld = this.Model.BillBusinessInfo.GetBillNoField();
// 分录序号
StringBuilder entrySort = new StringBuilder();
foreach (FilterEntity ety in e.SelectedEntities)
{
if (ety.Selected && ety.EntityType == BOSEnums.Enum_EntityType.Entity ||
ety.Selected && ety.EntityType == BOSEnums.Enum_EntityType.SubEntity) {
EntryEntity entryEntity = this.Model.BillBusinessInfo.GetEntryEntity(ety.Key);
if (string.IsNullOrWhiteSpace(entryEntity.SeqFieldKey))
{
entrySort.AppendFormat(", {0}.{1} ASC ",
entryEntity.TableAlias, entryEntity.EntryPkFieldName);
}
else
{
entrySort.AppendFormat(", {0}.{1} ASC ",
entryEntity.TableAlias, entryEntity.SeqFieldKey);
}
}
}
// 设置排序:创建日期、日期、分录序号
if (crDateFld != null)
{
if (numberFld != null)
{
e.SortString = string.Format(" {0} DESC,{1} DESC {2} ", crDateFld.Key, numberFld.Key, entrySort.ToString()); }
else
{
e.SortString = string.Format(" {0} DESC {1} ",
crDateFld.Key, entrySort.ToString());
}
}
}
}
}
}
BusinessInfo
当前界面对应的元数据对象;
语法
备注
与BillBusinessInfo属性相反,本属性为当前界面的元数据对象,而BillBusinessInfo为当前界面所管理的单据的元数据对象;
如列表界面,BusinessInfo为列表本身的元数据对象,而BillBusinessInfo,则为列表界面所展示的单据元数据对象
常用属性、方法,同BillBusinessInfo。
案例–信用重算过滤界面,列出可选单据
代码来源
Kingdee.K3.SCM.Credit.Business.PlugIn.CreditRecalFilterEdit
需求背景
信用重算列表过滤条件界面,提供一个下拉列表,填入可选单据,供用户选择不同单据进行信用重算;
实现方案
界面加载完毕后,取得界面上的下拉列表控件,添加可选项;
关键字
下拉列表可选项字段是否存在判断
示例代码
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata;
namespace Kingdee.K3.SCM.Credit.Business.PlugIn
{
publicclass CreditRecalFilterEdit : AbstractDynamicFormPlugIn
{
privatebool IsCustChecked;
privatebool IsGroupCustChecked;
privatebool IsOrgChecked;
privatebool IsDeptChecked;
privatebool IsSalerChecked;
privatebool IsSaleGroupChecked;
publicoverridevoid AfterBindData(EventArgs e)
{
SetObjTypeSelectedItem();
this.View.GetControl("FRefreshTrack").Enabled = false;
}
privatevoid SetObjTypeSelectedItem()
{
ComboField comfield = this.Model.BusinessInfo.GetElement("FObjectType") as ComboField;
if (comfield == null)
{
return;
}
ComboFieldEditor combox = this.View.GetFieldEditor("FObjectType", 0) as ComboFieldEditor; List
EnumItem blankitem = new EnumItem();
blankitem.Caption = new LocaleValue("",
Context.CurrentThread.CurrentCulture.LCID);
blankitem.EnumId = "";
blankitem.Seq = 0;
blankitem.Value = "";
listSubItems.Add(blankitem);
if (IsCustChecked == true)
{
EnumItem item = new EnumItem();
item.Caption = new LocaleValue("客户",
Context.CurrentThread.CurrentCulture.LCID);
item.EnumId = "";
item.Seq = 0;
item.Value = "BD_Customer";
listSubItems.Add(item);
}
if (IsGroupCustChecked == true)
{
EnumItem item = new EnumItem();
item.Caption = new LocaleValue("集团客户",
Context.CurrentThread.CurrentCulture.LCID);
item.EnumId = "";
item.Seq = 1;
item.Value = "BD_GroupCustomer";
listSubItems.Add(item);
}
if (IsSalerChecked == true)
{
EnumItem item = new EnumItem();
item.Caption = new LocaleValue("销售员", Context.CurrentThread.CurrentCulture.LCID);
item.EnumId = "";
item.Seq = 2;
item.Value = "BD_Saler";
listSubItems.Add(item);
}
if (IsSaleGroupChecked == true)
{
EnumItem item = new EnumItem();
item.Caption = new LocaleValue("销售组", Context.CurrentThread.CurrentCulture.LCID);
item.EnumId = "";
item.Seq = 3;
item.Value = "BD_SaleGroup";
listSubItems.Add(item);
}
if (IsDeptChecked == true)
{
EnumItem item = new EnumItem();
item.Caption = new LocaleValue("销售部门", Context.CurrentThread.CurrentCulture.LCID);
item.EnumId = "";
item.Seq = 4;
item.Value = "BD_Department";
listSubItems.Add(item);
}
if (IsOrgChecked == true)
{
EnumItem item = new EnumItem();
item.Caption = new LocaleValue("销售组织", Context.CurrentThread.CurrentCulture.LCID);
item.EnumId = "";
item.Seq = 5;
item.Value = "ORG_Organizations";
listSubItems.Add(item);
}
combox.SetComboItems(listSubItems);
}
}
}
Context
上下文对象。
语法
备注
本对象记录了与数据中心的连接,在调用各种K/3 Cloud提供的服务时,均需要传入本对象;另外,还记录了当前用户、语言等信息。
常用作服务参数;
常用属性
案例–销售员列表新增,验证用户权限
代码来源
Kingdee.K3.SCM.Business.PlugIn.OperatorF8List
需求背景
在”销售员”、”仓管员”列表上,用户点击新增时,需要验证用户对”操作员”的新增权限,如果无权,禁止用户新增;
此需求的难点,需要在一种单据(A)列表上,验证另外一种单据(B)的权限,无法通过BOS设计器的操作定义,配置权限项,必须使用插件实现;
实现方案
捕获销售员、仓管员列表的菜单单击时间,如果点击的菜单是”新增”菜单,则调用验权服务,进行验权,如果验权不通过,给出提示,禁止操作;否则,调出操作员新增界面;
对于默认的新增操作,则直接取消,不再显示销售员的新增界面;
关键字
调用验权服务验权显示单据新增界面取消菜单操作
示例代码
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using https://www.wendangku.net/doc/c013810535.html,ponentModel;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Permission;
using Kingdee.BOS.ServiceHelper;
using Kingdee.K3.Core.SCM;
namespace Kingdee.K3.SCM.Business.PlugIn
{
[Description("销售员,仓管员F8列表上的特殊处理")]
publicclass OperatorF8List : AbstractListPlugIn
{
publicoverridevoid BarItemClick(BarItemClickEventArgs e)
{
base.BarItemClick(e);
switch (e.BarItemKey.ToUpperInvariant())
{
case"TBNEW":
case"TBSPLITNEW":
e.Cancel = true;
PermissionAuthResult perAuthResult = PermissionServiceHelper.FuncPermissionAuth( this.Model.Context,
new BusinessObject() { Id = SCMFormIdConst.BD_Operator },
PermissionConst.New);
if (perAuthResult.Passed)
{
BillShowParameter showParameter = new BillShowParameter();
showParameter.FormId = SCMFormIdConst.BD_Operator;
showParameter.ParentPageId = this.View.PageId;
showParameter.Status = OperationStatus.ADDNEW;
this.View.ShowForm(showParameter);
}
else
{
this.View.ShowMessage("您没有业务员的新增权限!");
}
break;
default:
break;
}
}
publicoverridevoid BeforeDoOperation(BeforeDoOperationEventArgs e)
{
base.BeforeDoOperation(e);
switch (e.Operation.FormOperation.Operation.ToUpperInvariant())
{
case"NEW":
e.Cancel = true;
break;
default:
break;
}
}
}
}
DataChanged
界面上的数据包,是否被改动。
语法
备注
动态表单加载完毕,数据绑定到界面上之后,此属性被重置为false;此后,如果用户修改了界面上字段值,此属性更改为true;用户保存单据后,此属性会被重置为false。
因此,插件可以通过此属性,了解数据在上次保存之后,是否有改动;
案例–界面关闭前,检查改动,提醒保存
代码来源
Kingdee.K3.SCM.DRP.Business.PlugIn.DRPParameterEdit
需求背景
DRP系统参数配置界面,关闭界面前,检查用户是否修改了参数配置,但是未保存;如果有改动,则提醒用户保存。
实现方案
捕捉界面的BeforeClosed事件,在界面关闭前,进行修改检查;
关键字
系统参数界面关闭事件数据改动检查
示例代码
using System.Collections.Generic;
using https://www.wendangku.net/doc/c013810535.html,ponentModel;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.K3.SCM.ServiceHelper;
using Kingdee.K3.SCM.DRP.Core;
namespace Kingdee.K3.SCM.DRP.Business.PlugIn
{
[Description("DRP系统参数")]
publicclass DRPParameterEdit : AbstractDynamicFormPlugIn
{
// 无关逻辑,略去代码
publicoverridevoid BeforeClosed(BeforeClosedEventArgs e) {
if (this.Model.DataChanged&& _needNotifyBeforeClose)
{
e.Cancel = true;
string msg = "内容已经修改,是否保存?";
// 显示提示信息,本在用户确认后回调BeforeClosedCallBack函数this.View.ShowMessage(
msg,
MessageBoxOptions.YesNoCancel,
BeforeClosedCallBack);
}
}
///
///退出前,提示信息后的回调
///
///
privatevoid BeforeClosedCallBack(MessageBoxResult result) {
if (result == MessageBoxResult.Cancel) return;
if (result == MessageBoxResult.No)
{
_needNotifyBeforeClose = false;
this.View.Close();
return;
}
if (result == MessageBoxResult.Yes)
{
// 用户选择了需要保存
bool success = SaveParameter();
if (success)
{
_needNotifyBeforeClose = false;
this.View.Close();
return;
}
}
}
///
///保存参数
///
///
privatebool SaveParameter()
{
// 无关逻辑,略去代码
// 重置数据改动标志为false
this.Model.DataChanged = !saveResult &&this.Model.DataChanged; return saveResult;
}
}
}
DataObject
界面的后台数据包对象。
语法
属性定义
备注
通常来说,插件可以通过Model对象提供的方法,来读取、更新字段值,并触发字段值改变事件,无需直接访问此属性。
但是某些特殊场景,需要直接访问此属性,获取、更新字段值。
特别注意:通过访问DataObject对象来更新字段值,不会触发字段的值改变事件;如通过DataObject修改数量,不会自动计算金额;
案例–把子界面上的内容填入到本界面
代码来源
Kingdee.K3.SCM.DRP.Business.PlugIn.DRPElementEdit
需求背景
要补货方案要素界面,数据保存前,需要把公式配置子界面上,定义的公式、公式描述,填写到本界面的数据包,保存入库。
本需求的难点,在于公式编辑界面,是一个独立子界面,用户在其上编辑的公式,需要通过插件来取值,转存到本界面公式字段上,而且在填写过程中,不希望触发界面的值改变事件。
实现方案
捕获菜单单击事件BarItemClick,在保存前,取公式编辑子界面上的公式,格式化后填写到数据包;
关键字
嵌套界面显示子界面在面板中取子界面的值直接到数据包修改字段值
示例代码
C#
using System;
using System.Collections.Generic;
using https://www.wendangku.net/doc/c013810535.html,ponentModel;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Formula;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
namespace Kingdee.K3.SCM.DRP.Business.PlugIn
{
[Description("要补货方案要素表单插件")]
publicclass DRPElementEdit : AbstractBillPlugIn
{
//子页面ID
privatestring subPageId = "";
publicoverridevoid AfterBindData(EventArgs e)
{
base.AfterBindData(e);
// 在面板中,嵌入显示公式编辑子页面
ShowExpressionEditor();
}
publicoverridevoid BarItemClick(BarItemClickEventArgs e)
{
switch (e.BarItemKey.ToUpperInvariant())
{
case"TBSPLITSAVE":
case"TBSAVE":
case"TBSAVETEMP":
// 取子界面上字段值,填写到本界面数据包
IDynamicFormView expressionView = this.View.GetView(subPageId) as IDynamicFormView; DynamicObject dataObject = this.View.Model.DataObject;
dataObject["EXPRESSION"] = GetFormulaData(expressionView);
dataObject["EXPRESSIONDESC"] = GetFormulaDisplayText();
break;
}
}
#region私有方法
///
///显示公式编辑器,嵌套在本界面,公式编辑面板上
///
privatevoid ShowExpressionEditor()
{
// 无关代码,略过
}
#endregion
}
}
FunctionLib
支持实体规则运算的函数库;
语法
备注
只有函数库中注册过的函数,才能被实体服务规则的前置条件、计算公式等引用,并顺利解析。
如IsPush()函数、IsDraw()函数等,需要先到平台注册,申明函数元数据对象。运行时,会据此生成函数库,支持实体规则的运算;
示例代码暂缺;
OpenParameter
显示当前界面时,传入的参数。
语法
备注
可以从此属性中,获取本界面的打开模式,以及定制参数等;
在父窗口A,显示子窗口B时,可能会需要传入一些定制的参数,以便控制子窗口B的行为;
子窗口B,就可以通过本属性,获取到父窗口A传入的定制参数,并据此作出控制;
案例–列表特定场景下隐藏菜单
代码来源
Kingdee.K3.SCM.Business.PlugIn.HideMainBarMenuList
需求背景
专用于下推的列表,不能显示新增、修改等菜单;
实现方案
在列表界面加载时,读取列表调用参数,判断当前场景是否专用于下推,如果是,则隐藏菜单;
关键字
界面调用定制参数列表场景隐藏菜单界面初始化事件
示例代码
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using https://www.wendangku.net/doc/c013810535.html,ponentModel;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Metadata.BarElement;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.K3.Core;
namespace Kingdee.K3.SCM.Business.PlugIn
{
///
///目前用于:应收应付调用时候,根据标示来隐藏列表上的菜单
///只显示如下菜单:下推、过滤、退出、刷新
///并把下推的名称改名
///
[Description("隐藏列表上的菜单插件")]
publicclass HideMainBarMenuList : AbstractListPlugIn
{
publicoverridevoid OnInitialize(InitializeEventArgs e)
{
base.OnInitialize(e);
this.IsNeed = GetCustomerPara(this.View);
}
publicoverridevoid AfterBindData(EventArgs e)
{
HideMainBarItemForConvert(this.View, this.ListView, this.IsNeed);
base.AfterBindData(e);
}
///
///判断是否应收应付选单
///
///
///
protectedbool GetCustomerPara(IDynamicFormView view)
{
object obj = view.Model.OpenParameter.GetCustomParameter(PublicConst.ForList_Push);
bool isFromARAP = false;
if (obj != null)
{
isFromARAP = true;
this.ReNamePushMenu = obj.ToString();
}
return isFromARAP;
}
///
///隐藏菜单,应收应付会调用到这边的单据,但是有些菜单又不想显示,需要隐藏.
///添加人:wgj 2012-04-12
///
///
///
protectedvoid HideMainBarItemForConvert(IDynamicFormView view, IListView listView, Boolean isHide = false)
{
if (!isHide)
{
return;
}