代码添加控件原创
金蝶云社区-疯狂的石头
疯狂的石头
84人赞赏了该文章 1237次浏览 未经作者许可,禁止转载编辑于2020年12月20日 17:12:36

using Kingdee.BOS.Core.DynamicForm.PlugIn;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ComponentModel;

using Kingdee.BOS;

using Kingdee.BOS.Util;

using Kingdee.BOS.Core;

using Kingdee.BOS.Core.Metadata;

using Kingdee.BOS.Core.Metadata.ControlElement;

using Kingdee.BOS.Core.Metadata.FieldElement;

using Kingdee.BOS.Core.Metadata.EntityElement;

using Kingdee.BOS.Core.DynamicForm;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;


namespace PLM.BusinessPlugIn

{

    public class MakeControl : AbstractDynamicFormPlugIn

    {

        ///


        /// 演示如何动态构建表单上单据体的列

        ///


        /// 

        /// 示例界面要求:

        /// 1. 菜单 : 开始构建列 tbBuild

        /// 2. 整数字段:指定构建列数 F_JD_ColCount

        /// 3. 单据体表格:列表 FList

        /// 

        /// 演示过程:

        /// 1. 用户点击"开始构建列"菜单;

        /// 2. 清除单据体表格列,根据指定的列数,重新生成单据体表格列,并填充数据

        /// 

        [Description("演示如何动态构建表单上单据体的列")]

        public class S150517DynamicCreateColsEdit : AbstractDynamicFormPlugIn

        {

            ///

            /// 元数据

            ///

            private BusinessInfo _currInfo = null;

            ///

            /// 界面布局

            ///

            private LayoutInfo _currLayout = null;

            ///

            /// 初始化界面元数据时触发此事件

            ///

            /// 

            /// 

            /// 通常在此事件中,修改界面元数据;

            /// 本示例,在此事件中,把界面元数据复制到本地,避免与其他实例公用元数据,造成串账

            /// 

            public override void OnSetBusinessInfo(SetBusinessInfoArgs e)

            {

                // 复制界面元数据到本地变量

                FormMetadata currMeta = (FormMetadata)ObjectUtils.CreateCopy(

                this.View.OpenParameter.FormMetaData);

                _currInfo = currMeta.BusinessInfo;

                _currLayout = currMeta.GetLayoutInfo();

                // 用本地的元数据,替换动态表单引擎持有的元数据

                e.BusinessInfo = _currInfo;

                e.BillBusinessInfo = _currInfo;

            }

            ///


            /// 初始化界面元数据时触发此事件

            ///


            /// 

            /// 

            /// 通常在此事件中,修改界面元数据;

            /// 本示例,在此事件中,把界面元数据复制到本地,避免与其他实例公用元数据,造成串账

            /// 

            public override void OnSetLayoutInfo(SetLayoutInfoArgs e)

            {

                e.LayoutInfo = _currLayout;

                e.BillLayoutInfo = _currLayout;

            }

            ///

            /// 菜单点击事件

            ///

            /// 

            /// 

            /// 在此事件中,拦截用户点击"重新构建列"菜单,重新构建单据体表格

            /// 

            public override void AfterBarItemClick(AfterBarItemClickEventArgs e)

            {

                if (e.BarItemKey.EqualsIgnoreCase("tbBuild"))

                {

                    int colCount = Convert.ToInt32(this.Model.GetValue("F_JD_ColCount"));

                    // 修改元数据

                    this.ReBuildFields(colCount);

                    // 根据新的元数据,重构单据体表格列

                    EntryGrid grid = (EntryGrid)this.View.GetControl("FList");

                    grid.SetAllowLayoutSetting(false); // 列按照索引显示

                    EntityAppearance listAppearance = _currLayout.GetEntityAppearance("FList");

                    grid.CreateDyanmicList(listAppearance);


                    // 填充数据

                    this.SetData();

                    this.Model.SetValue("F_JD_ColCount", colCount);

                    // 下达一个指令

                    this.View.SendDynamicFormAction(this.View);

                }

            }

            ///


            /// 在单据体元数据中,重新构建字段。字段数量由参数决定

            ///


            /// 

            private void ReBuildFields(int fieldCount)

            {

            // 获取单据体表格的元数据及外观

            Entity entity = _currInfo.GetEntity("FList");

            EntityAppearance entityApp = _currLayout.GetEntityAppearance("FList");

            // 清除全部字段

            int oldCount = entity.Fields.Count;

            for(int i = oldCount - 1; i >= 0; i--)

            {

            //Field fld = entity.Fields[i][i];

            

            //[i] _currInfo.Remove(fld);

            Field fld = new Field();

            Appearance fldApp = _currLayout.GetAppearance(fld.Key);

            _currLayout.Remove(fldApp);

            }

            // 重新添加字段

            for (int i = 1; i <= fieldCount; i++)

            {

            // 构建文本字段

            TextField fld = new TextField();

            fld.Key = string.Format("F{0}", i);

            fld.Name = new LocaleValue(string.Format("字段{0}", i));

            fld.PropertyName = fld.Key;

            fld.EntityKey = "FList";

            fld.Entity = entity;

            _currInfo.Add(fld);

            TextFieldAppearance fldApp = new TextFieldAppearance();

            fldApp.Key = fld.Key;

            fldApp.Caption = fld.Name;

            fldApp.EntityKey = fld.EntityKey;

            fldApp.Width = new LocaleValue("150");

            fldApp.LabelWidth = new LocaleValue("80");

            fldApp.Tabindex = i;

            fldApp.Field = fld;

            _currLayout.Add(fldApp);

            }

            }

            ///


            /// 为单据体创建一行数据

            ///


            private void SetData()

            {

                // 使用最新的元数据,重新界面数据包

                _currInfo.GetDynamicObjectType(true);

                this.Model.CreateNewData();


                foreach (Field fld in _currInfo.GetEntity("FList").Fields)

                {

                    this.Model.SetValue(fld.Key, string.Format("{0}的值", fld.Name.ToString()), 0);

                }

            }

        }

    }

}


赞 84