电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

二开-表单插件-代码创建控件

来源:金蝶云社区作者:金蝶2024-09-166

二开-表单插件-代码创建控件

  • 一,开发功能介绍

        首先介绍开发功能,通过C#代码修改元数据的形式去动态创建控件,目前已实现功能: 在一个动态表单上采用代码构建出控件。目前已经实现通过代码创建出单据体,文本,分组标题等控件。别问为什么去做这些功能,问就是闲的。

        直接上代码,具体的控件构建代码直接看元数据操作辅助类--MetadataUtils

        也是参照大佬的帖子 做出来的 详情贴:https://wenku.my7c.com/article/128545166554105344?productLineId=1

        如果有帮助,给我点点收藏+点赞哦


using Kingdee.BOS;
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;
using Kingdee.BOS.Core.Metadata.ControlElement;
using Kingdee.BOS.Core.Metadata.ElementMetadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata.Util;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Orm.Metadata.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace BL.K3.Plugln.Bill.ENGRouteProcess
{
    [Description("二开-【动态表单插件】-动态表单动态构建工艺参数展示数据"), HotUpdate]
    public class EngProcessPanel : AbstractDynamicFormPlugIn
    {
        #region var        
        /// <summary>
        /// 动态表格的表头布局元数据
        /// </summary>
        private LayoutInfo dynamicLayoutInfo = new LayoutInfo();
        /// <summary>
        /// 动态表格的表体布局元数据
        /// </summary>
        private List<LayoutInfo> dynamicEntityLayoutInfo = new List<LayoutInfo>();
        private List<Appearance> listAppearance = new List<Appearance>();
        private List<Field> listField = new List<Field>();
        private List<Entity> listEntity = new List<Entity>();
        private string entrykey = string.Empty;
        private List<object> ProIds =new List<object>();
        #endregion
        public override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            var parentPanel = this.View.GetControl<Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel.Container>("F_QPUB_Panel");
            parentPanel.AddControls(this.dynamicLayoutInfo);            
            foreach (var entity in this.listEntity)
            {
                //给表格动态创建列
                var gridAP = this.View.LayoutInfo.GetEntryEntityAppearance(entity.Key);
                var entryGrid = this.View.GetControl<EntryGrid>(entity.Key);
                entryGrid.CreateDyanmicList(gridAP);
                entryGrid.Enabled = true;
            }
        }
        public override void OnInitializeService(InitializeServiceEventArgs e)
        {
            base.OnInitializeService(e);
            this.dynamicLayoutInfo = new LayoutInfo();
            //获取对应选中工序序列的数据包
            var EntiData = (DynamicObject)this.View.OpenParameter.GetCustomParameter("data");           
            //若未获取到数据包
            if (EntiData.IsNullOrEmptyOrWhiteSpace() || EntiData == null || EntiData.ToString() == "0") return;
            //获取工序序列对应序列名称
            var SeqName = (EntiData["SeqName"] as LocaleValue).GetString(2052);
            //获取对应的工序明细
            var DetailData = (DynamicObjectCollection)EntiData["RouteOperDetail"];
            int topxy = 10;
            int i = 0;
            //遍历明细 获取所有的工序作业数据包
            foreach (var detail in DetailData)
            {
                bool first = false; //控制首次创建标题字段
                int J = 0; //控制循环次数     
                if (detail["ProcessId"].IsNullOrEmptyOrWhiteSpace()) continue;
                //获取对应作业行的工序号
                var operNumber = detail["OperNumber"].ToString();
                //获取对应的作业数据包
                //var workData = (DynamicObject)detail["ProcessId"];
                FormMetadata meta = MetaDataServiceHelper.Load(this.Context, "ENG_Process") as FormMetadata;
                var workData = BusinessDataServiceHelper.LoadSingle(this.Context, detail["ProcessId_Id"], meta.BusinessInfo.GetDynamicObjectType());
                if (workData.IsNullOrEmptyOrWhiteSpace()) continue;
                var workname = (workData["name"] as LocaleValue).GetString(2052);
                //用一个object数组存放 序列名称 工序号 作业名称 参数标识 参数类型 参数名 
                object[] proxy = new object[8];
                proxy[0] = SeqName;                                          //工序序列-序列名称
                proxy[1] = operNumber;                                       //工序明细-工序号
                proxy[2] = workname;                                         //工序明细-作业名称
                proxy[3] = workData["number"];                               //工序明细-作业编码
                proxy[4] = detail["id"];                                     //工序明细-工序内码
                this.ProIds.Add(detail["id"]);
                //获取作业对应的作业参数
                var workPara = workData["FParaterEntity"] as DynamicObjectCollection;         
                //若对应的作业参数数据包不为空,正常添加内容,否则只添加一个标题控件
                if (!workPara.IsNullOrEmptyOrWhiteSpace() && workData["FParaterEntity"] != null &&workPara.Count!=0)
                {
                    foreach (var para in workPara.OrderBy(p => p["F_BL_ParameterTypes"].Equals("单据体") ? 1 : 0).ToList())
                    {                        
                        proxy[5] = para["F_BL_ParameterId"];                         //作业参数-参数标识
                        proxy[6] = para["F_BL_ParameterTypes"];                      //作业参数-参数类型
                        proxy[7] = para["F_BL_parameterName"];                       //作业参数-参数名
                        //首先第一次创建一个分组标题字段
                        if (!first)
                        {
                            topxy += 25;
                            CreateGroupTitle(topxy, proxy);
                            first = true;
                            i++;
                        }
                        //参数类型非单据体
                        if (!proxy[6].Equals("单据体"))
                        {
                            if (J % 2 == 0) topxy += 25;
                            //表头字段
                            var fieldName = string.Format("{0}_{1}", proxy[5], proxy[4]);//字段标识: 参数标识_工序明细内码
                            var fieldCapt = string.Format("{0}_{1}", proxy[7], proxy[2]);//字段名称: 参数名_作业名称
                            var field = MetadataUtils.CreateField<TextField, TextFieldAppearance>(this.Context, this.View, "FBillHead", fieldName, fieldCapt, topxy, J % 2 * 280);
                            this.listAppearance.Add(field);
                            this.listField.Add(field.Field);
                            this.dynamicLayoutInfo.Add(field);
                            if (J % 2 == 1) i++;
                            J++;
                        }
                        //创建单据体表体
                        else
                        {
                            topxy += 25;
                            var entiid = string.Format("{0}_{1}", proxy[5], proxy[4]);     //单据体标识-需要拿该标识去工艺参数元数据中匹配查找表对应的元数据
                            var panelid = string.Format("F_BL_PANEL_{0}", proxy[4]);       
                            var entiName = proxy[7].ToString();   //单据体名称
                            var panel = MetadataUtils.CreatePanel(this.Context, this.View, panelid, panelid, topxy);
                            this.listAppearance.Add(panel);
                            var entity = MetadataUtils.CreateEntity<EntryEntity, EntryEntityAppearance>(this.Context, this.View, entiid, entiName, panelid);                            
                            this.listAppearance.Add(entity);
                            this.listEntity.Add(entity.Entity);
                            this.dynamicLayoutInfo.Add(panel);
                            this.dynamicLayoutInfo.Add(entity);
                            i++;
                            //动态构建单据体的字段内容
                            //1.获取工艺参数单据的元数据用于动态构建单据体
                            var paraMeta = MetaDataServiceHelper.GetFormMetaData(this.Context, "QPUB_BL_Parameter");
                            var entityName = proxy[5].ToString();
                            //获取指定单据体的数据包
                            var entityBussin = paraMeta.BusinessInfo.GetEntity(entityName);
                            var fieldList = entityBussin.Fields.Select(o => o).ToList();
                            var metadataCopy = (FormMetadata)ObjectUtils.CreateCopy(this.View.OpenParameter.FormMetaData);
                            //动态创建Businesslnfo
                            var businesslnfo = metadataCopy.BusinessInfo;
                            Entity enti = businesslnfo.GetEntity(entityName);
                            if(this.entrykey.IsNullOrEmptyOrWhiteSpace()) this.entrykey = entiid;
                            for (int k = 0; k < fieldList.Count; k++)
                            {
                                var fieldAp = MetadataUtils.CreateEntityField<TextField, TextFieldAppearance>(this.Context, this.View, fieldList[k], enti, entiid, k);
                                this.listAppearance.Add(fieldAp);
                                this.listField.Add(fieldAp.Field);
                                this.dynamicLayoutInfo.Add(fieldAp);
                            }
                            topxy += 300;
                        }
                    }
                    if (J % 2 == 1) i++;
                }
                else
                {
                    topxy += 25;
                    CreateGroupTitle(topxy, proxy);
                    i++;
                }
            }           
        }
        /// <summary>
        /// 初始化当前动态表单的数据包
        /// </summary>
        /// <param name="e"></param>
        public override void BeforeBindData(EventArgs e)
        {
            base.BeforeBindData(e);                       
            this.Model.DataObject = new DynamicObject(this.View.BusinessInfo.GetDynamicObjectType());            
        }
        public override void AfterBindData(EventArgs e)
        {
            base.AfterBindData(e);
            //获取对应选中工序序列的数据包
            var EntiData = (DynamicObject)this.View.OpenParameter.GetCustomParameter("data");
            //若未获取到数据包 则返回
            if (EntiData.IsNullOrEmptyOrWhiteSpace()) return;
            this.SetData();
        }
        /// <summary>
        /// 动态设置表单业务元数据
        /// </summary>
        /// <param name="e"></param>
        public override void OnSetBusinessInfo(SetBusinessInfoArgs e)
        {
            base.OnSetBusinessInfo(e);            
            // 动态创建businessinfo,先移除后添加
            var businessInfo = (BusinessInfo)ObjectUtils.CreateCopy(this.View.BusinessInfo);
            foreach (var field in this.listField)
            {
                businessInfo.Remove(field);
            }
            foreach (var entity in this.listEntity)
            {
                businessInfo.Remove(entity);
            }
            foreach (var entity in this.listEntity)
            {
                businessInfo.Add(entity);
            }
            foreach (var field in this.listField)
            {
                businessInfo.Add(field);
            }
            
            //修改了元数据,重新生成该元数据的类型定义
            businessInfo.GetDynamicObjectType(true);
            e.BusinessInfo = businessInfo;
            e.BillBusinessInfo = businessInfo;
        }
        /// <summary>
        /// 动态设置表单布局元数据
        /// </summary>
        /// <param name="e"></param>
        public override void OnSetLayoutInfo(SetLayoutInfoArgs e)
        {
            base.OnSetLayoutInfo(e);              
            //动态创建LayoutInfo
            var layoutInfo = (LayoutInfo)ObjectUtils.CreateCopy(this.View.LayoutInfo);
            foreach (var item in this.listAppearance)
            {
                layoutInfo.Remove(item);
            }
            foreach (var appearances in this.listAppearance)
            {
                layoutInfo.Add(appearances);
            }
            e.LayoutInfo = layoutInfo;
            e.BillLayoutInfo = layoutInfo;
        }
        //给构建出来的表头字段和表体字段进行赋值操作
        private void SetData()
        { 
            //遍历明细数据包,获取当前工序明细行作业的Id集合
            //拿对应的Id去查询对应配置的工艺参数的数据包,将其中的数据赋值到对应字段当中
            foreach (var id in this.ProIds)
            {
                //查询当前明细行作业对应的工艺参数单据内码
                string sql = string.Format(@"/*dialect*/select fid from T_BL_ProcessParameter where FPROCESSID='{0}'", id);
                var result = DBServiceHelper.ExecuteDynamicObject(this.Context, sql);
                if (result.Count > 0)
                {
                    //获取指定工艺参数的数据包,用于给表头字段赋值
                    FormMetadata meta = MetaDataServiceHelper.Load(this.Context, "QPUB_BL_Parameter") as FormMetadata;
                    var Pamadata = BusinessDataServiceHelper.LoadSingle(this.Context, result[0]["fid"], meta.BusinessInfo.GetDynamicObjectType());
                    //获取当前工序明细行已配置的字段,赋值
                    var headFields = this.View.BusinessInfo.GetEntity("FBillHead").Fields.FindAll(o => o.PropertyName.Contains(id.ToString())).Select(o => o.PropertyName).ToList();
                    //获取工序序列明细配置的字段
                    var metaFields = meta.BusinessInfo.GetEntity("FBillHead").Fields;
                    foreach (var heafid in headFields)
                    {
                        var propertyName = heafid.Replace("_" + id, "");
                        var field = metaFields.First(o => o.PropertyName.EqualsIgnoreCase(propertyName));
                 

二开-表单插件-代码创建控件

一,开发功能介绍 首先介绍开发功能,通过C#代码修改元数据的形式去动态创建控件,目前已实现功能: 在一个动态表单上采用代码构建出...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信