插件事件示例代码 - OnSetBusinessInfo、OnSetLayoutInfo事件
金蝶云社区-云社区用户S6651234
云社区用户S6651234
14人赞赏了该文章 7,843次浏览 未经作者许可,禁止转载编辑于2014年12月31日 09:27:45

OnSetBusinessInfo事件 触发时机在请求加载页面之后,渲染界面控件之前触发。应用场景让插件有机会在界面渲染控件之前,更改元数据,从而实现动态调整界面,增删字段。关键字修改元数据 动态 添加列 添加字段 添加控件备注本事件通常需要与OnSetLayoutInfo一起使用,一个修改单据的业务模型(BusinessInfo),另外一个修改单据的布局模型(LayoutInfo)。案例 – 动态生成尺码列 代码来源服装行业产品,动态生成尺码列,技术预研插件需求背景服装行业,服装尺码,配码方案多样且支持动态变化,所含尺码也允许不断调整。销售单据,录入物料之前,需先选择配码方案,然后在物料明细表格中,把所选的配码方案包含的尺码,动态的显示在表格中,用户直接在这些尺码下面录入数量。各个尺码的数量之和,为该物料的销售总数量;实现方案在请求加载销售订单界面之后,渲染订单界面字段之前,读取全部配码方案,所含的全部尺码,然后为每个尺码在明细表格中,动态生成一列;界面加载完毕,用户选择配码方案后,插件控制只显示本配码方案的尺码,其他非本配码方案的尺码,全部隐藏。在实现方案中,需通过捕获OnSetBusinessInfo事件,动态添加尺码字段的逻辑元数据(Field对象),这些字段的外观位置,则需要通过捕获OnSetLayoutInfo事件实现。示例代码 [code]///


/// 调整单据的逻辑元数据包,动态添加尺码列
///

///
public override void OnSetBusinessInfo(SetBusinessInfoArgs e)
{
// 创建当前单据元数据副本,避免直接修改原始元数据,并发时串账
FormMetadata currmetadata = (FormMetadata)ObjectUtils.CreateCopy(
this.View.OpenParameter.FormMetaData);
_currBusinessInfo = currmetadata.BusinessInfo;
_currLayoutInfo = currmetadata.GetLayoutInfo();

// 取物料明细单据体的元数据模型
string currEntityKey = "FEntity";
var currEntity = _currBusinessInfo.GetEntity(currEntityKey);

// 修改明细单据体采用的表格名称,指向进行了行列转换,包含了各个尺码的视图
currEntity.TableName = "v_Cust_JDDynamicColumnEntry";

// 取原始的数量。动态添加的尺码字段,是基于原始数量字段的一个分身
Field qtyField = _currBusinessInfo.GetField("FQty");
FieldAppearance qtyFldApp = _currLayoutInfo.GetFieldAppearance("FQty");

// 演示动态添加2个尺寸到单据体:FSize1, FSize2,采用数量字段模板
// 基于数量字段,复制出FSize1字段,并设置必须改动的属性
Field size1Field = (Field)ObjectUtils.CreateCopy(qtyField);
size1Field.DynamicProperty = null;
size1Field.ChildrenFields.Clear();
size1Field.EntityKey = currEntityKey;
size1Field.Entity = currEntity;
if (size1Field.UpdateActions != null)
{
size1Field.UpdateActions.Clear();
}
// 必改属性,涉及到数据的加载
size1Field.Key = "FSize1";
size1Field.FieldName = "FSize1";
size1Field.PropertyName = "FSize1";
size1Field.Name = new LocaleValue("Size1");

// 把FSize1字段,添加到单据的逻辑元数据模型(BusinessInfo)中
_currBusinessInfo.Add(size1Field);

// 基于数量字段,复制出FSize2字段,并设置必须改动的属性
Field size2Field = (Field)ObjectUtils.CreateCopy(qtyField);
size2Field.DynamicProperty = null;
size2Field.ChildrenFields.Clear();
size2Field.EntityKey = currEntityKey;
size2Field.Entity = currEntity;
if (size2Field.UpdateActions != null)
{
size2Field.UpdateActions.Clear();
}
// 必改属性,涉及到数据的加载
size2Field.Key = "FSize2";
size2Field.FieldName = "FSize2";
size2Field.PropertyName = "FSize2";
size2Field.Name = new LocaleValue("Size2");

// 把FSize2字段,添加到单据的逻辑元数据模型(BusinessInfo)中
_currBusinessInfo.Add(size2Field);

// 删除仅用于占位的尺码字段
_currBusinessInfo.Remove(_currBusinessInfo.GetElement("FSize"));

// 强制要求重新构建单据的ORM模型
_currBusinessInfo.GetDynamicObjectType(true);

// 输出动态调整后的单据逻辑元数据模型(BusinessInfo)
e.BusinessInfo = _currBusinessInfo;
e.BillBusinessInfo = _currBusinessInfo;
}
[/code]

OnSetLayoutInfo事件 触发时机在请求加载页面之后,渲染界面控件之前触发。应用场景让插件有机会在界面渲染控件之前,更改元数据,从而实现动态调整界面,增删字段。关键字修改元数据 动态 添加列 添加字段 添加控件备注本事件通常需要与OnSetBusinessInfo一起使用,一个修改单据的业务模型(BusinessInfo),动态添加字段,另外一个修改单据的布局模型(LayoutInfo),设置动态添加字段的外观、位置。案例 – 动态生成尺码列 代码来源服装行业产品,动态生成尺码列,技术预研插件需求背景服装行业,服装尺码,配码方案多样且支持动态变化,所含尺码也允许不断调整。销售单据,录入物料之前,需先选择配码方案,然后在物料明细表格中,把所选的配码方案包含的尺码,动态的显示在表格中,用户直接在这些尺码下面录入数量。各个尺码的数量之和,为该物料的销售总数量;实现方案在请求加载销售订单界面之后,渲染订单界面字段之前,读取全部配码方案,所含的全部尺码,然后为每个尺码在明细表格中,动态生成一列;界面加载完毕,用户选择配码方案后,插件控制只显示本配码方案的尺码,其他非本配码方案的尺码,全部隐藏。在实现方案中,捕获OnSetLayoutInfo事件,是为了给动态生成的尺码字段,产生外观位置(FieldAppreance对象)。示例代码 [code]///


/// 调整单据的布局元数据,为动态添加的尺码列,产生外观布局对象
///

///
public override void OnSetLayoutInfo(SetLayoutInfoArgs e)
{
// 取数量字段的外观布局对象,尺码需仿照数量外观
FieldAppearance qtyFldApp = _currLayoutInfo.GetFieldAppearance("FQty");

// 取物料明细表格外观布局对象
EntityAppearance entryApp = _currLayoutInfo.GetEntityAppearance(qtyFldApp.EntityKey);

// 设置字段的录入顺序
int tabIndex = qtyFldApp.Tabindex;
// 把数量之后的全部字段录入顺序,再后退2个位置,为新增加的字段流出空挡
var fldList = (from p in entryApp.Layoutinfo.Appearances
where (p is FieldAppearance) && ((FieldAppearance)p).Tabindex >= tabIndex
select (FieldAppearance)p );
foreach(var fld in fldList)
{
fld.Tabindex = fld.Tabindex + 2;
}

// 基于数量的外观,产生出FSize1的外观
FieldAppearance size1FieldApp = (FieldAppearance)ObjectUtils.CreateCopy(qtyFldApp);
size1FieldApp.Key = "FSize1";
size1FieldApp.Caption = new LocaleValue("Size1");
size1FieldApp.Field = _currBusinessInfo.GetField("FSize1");
size1FieldApp.Tabindex = tabIndex;
tabIndex++;
// 把FSize1的外观,加入到单据布局对象中
_currLayoutInfo.Add(size1FieldApp);

// 基于数量的外观,产生出FSize2的外观
FieldAppearance size2FieldApp = (FieldAppearance)ObjectUtils.CreateCopy(qtyFldApp);
size2FieldApp.Key = "FSize2";
size2FieldApp.Caption = new LocaleValue("Size2");
size2FieldApp.Field = _currBusinessInfo.GetField("FSize2");
size2FieldApp.Tabindex = tabIndex;
tabIndex++;
// 把FSize2的外观,加入到单据布局对象中
_currLayoutInfo.Add(size2FieldApp);

// 移除仅用于占位的FSize字段
_currLayoutInfo.Remove(_currLayoutInfo.GetAppearance("FSize"));

// 对表格中的字段,重新按照TabIndex进行排序
entryApp.Layoutinfo.Sort();

// 输出动态调整后的单据布局
e.LayoutInfo = _currLayoutInfo;

// 要求物料明细表格,重新构建各列,以便把新加入的尺码列,也加入到表格控件中
EntryGrid grid = this.View.GetControl("FEntity");
grid.SetCustomPropertyValue("AllowLayoutSetting", false);
grid.CreateDyanmicList(_currLayoutInfo.GetEntityAppearance("FEntity"));
this.View.SendDynamicFormAction(this.View);
}
[/code]