二开案例.表单插件.动态创建下拉列表字段

【应用场景】使用插件,给表单动态的创建下拉列表字段。
【案例演示】新建动态表单,通过插件动态创建下拉列表字段。

【实现步骤】
<1>编写表单插件,代码如下。
using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ControlElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.BOS.Web.DynamicForm;
using System;
using System.ComponentModel;
using System.Reflection;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【表单插件】动态创建下拉列表字段
/// </summary>
[Description("【表单插件】动态创建下拉列表字段"), HotUpdate]
public class CreateComboFieldFormPlugIn : AbstractDynamicFormPlugIn
{
#region event
/// <summary>
/// 动态构造表单元数据
/// </summary>
/// <param name="e"></param>
public override void OnSetLayoutInfo(SetLayoutInfoArgs e)
{
base.OnSetLayoutInfo(e);
// 创建元数据副本
var metadataCopy = (FormMetadata)ObjectUtils.CreateCopy(this.View.OpenParameter.FormMetaData);
// 动态创建BusinessInfo
var businessInfo = metadataCopy.BusinessInfo; //(BusinessInfo)ObjectUtils.CreateCopy(this.View.BusinessInfo);
// 动态创建LayoutInfo
var layoutInfo = metadataCopy.GetLayoutInfo(); //ObjectUtils.CreateCopy(this.View.LayoutInfo);
// 动态创建下拉列表字段
var fieldAp = MetadataUtils.CreateField<ComboField, ComboFieldAppearance>(this.Context, businessInfo, "FBillHead", "F_Jac_Combo_Country", "F_Jac_Combo_Country", "国家(动态)", 200, 10);
var field = (ComboField)fieldAp.Field;
field.MustInput = 1;
field.FireUpdateEvent = 1;
field.EnumType = "8a6e30f0-2c26-4639-aff5-76749daa355e";
var enumObject = new EnumObject(new DynamicObject(EnumObject.EnumObjectType));
enumObject.Id = ((ComboField)fieldAp.Field).EnumType;
var enumItem = new EnumItem();
enumItem.EnumId = "China";
enumItem.Caption = new LocaleValue("中国");
enumItem.Value = Convert.ToString("1");
enumItem.Seq = 1;
enumObject.Items.Add(enumItem);
enumItem = new EnumItem();
enumItem.EnumId = "America";
enumItem.Caption = new LocaleValue("美国");
enumItem.Value = Convert.ToString("2");
enumItem.Seq = 2;
enumObject.Items.Add(enumItem);
field.EnumObject = enumObject;
// 将动态字段注入业务元数据
businessInfo.Add(fieldAp.Field);
// 将动态字段注入外观元数据
layoutInfo.Add(fieldAp);
// 借助容器控件输出动态字段
var parentPanel = this.View.GetControl<Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel.Container>("F_Jac_Panel");
var layout = new LayoutInfo();
layout.Add(fieldAp);
parentPanel.AddControls(layout);
// 重建元数据的动态类型
businessInfo.GetDynamicObjectType(true);
// 使用动态构建的元数据替换现有元数据
MetadataUtils.SetProperty(this.View, "BusinessInfo", businessInfo);
MetadataUtils.SetProperty(this.View, "BillBusinessInfo", businessInfo);
MetadataUtils.SetProperty(this.View, "LayoutInfo", layoutInfo);
MetadataUtils.SetProperty(this.View, "BillLayoutInfo", layoutInfo);
}
public override void BarItemClick(BarItemClickEventArgs e)
{
base.BarItemClick(e);
if (e.BarItemKey.EqualsIgnoreCase("tbGetValue"))
{
var val1 = (string)this.Model.GetValue("F_Jac_Combo");
var val2 = (string)this.Model.GetValue("F_Jac_Combo_Country");
var msg = string.Format("发货状态:{0};国家:{1}", val1, val2);
this.View.ShowMessage(msg);
return;
}
}
#endregion
#region 元数据操作辅助类
/// <summary>
/// 元数据操作辅助类
/// </summary>
public static class MetadataUtils
{
/// <summary>
/// 创建字段
/// </summary>
/// <typeparam name="TField"></typeparam>
/// <typeparam name="TFieldAppearance"></typeparam>
/// <param name="ctx"></param>
/// <param name="businessInfo"></param>
/// <param name="entityKey"></param>
/// <param name="caption"></param>
/// <param name="propName"></param>
/// <param name="fieldName"></param>
/// <param name="top"></param>
/// <param name="left"></param>
/// <returns></returns>
public static TFieldAppearance CreateField<TField, TFieldAppearance>(Context ctx, BusinessInfo businessInfo, string entityKey, string fieldName, string propName, string caption, int top = 0, int left = 0)
where TFieldAppearance : FieldAppearance, new()
二开案例.表单插件.动态创建下拉列表字段
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



