二开案例.过滤插件.列表过滤窗体上隐藏分录

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.过滤插件.列表过滤窗体上隐藏分录

【应用场景】列表过滤窗体上隐藏分录,同时将该分录的字段在过滤条件的字段集合中移除。

【案例演示】采购订单列表过滤界面,仅显示单据头【基本信息】,其它分录全部隐藏,对应字段也在过滤,高级过滤,快捷过滤的字段集合中移除。

【解决方案】

<1>编写列表过滤插件,控制列表过滤界面上的分录不可见,过滤条件下的字段不可见。

<2>编写列表插件,控制列表界面上的快捷过滤下的字段不可见。

【实现步骤】

<1>编写列表过滤插件,代码如下。

using Kingdee.BOS.Core.CommonFilter;

using Kingdee.BOS.Core.List.PlugIn;

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

using Kingdee.BOS.Core.ListFilter;

using Kingdee.BOS.Util;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Linq;

using System.Reflection;


namespace Jac.XkDemo.BOS.Business.PlugIn

{

    /// <summary>

    /// 【过滤插件】列表过滤窗体上隐藏分录

    /// </summary>

    [Description("【过滤插件】列表过滤窗体上隐藏分录"), HotUpdate]

    public class HideFilterEntityListFilterPlugIn : AbstractListFilterPlugIn

    {

        /// <summary>

        ///在过滤窗体中可见的单据体Key集合(注意:单据头必须显示和选中)

        /// </summary>

        private string[] showEntityKeys = { "FBillHead" };


        public override void FireBeforeBindFilterMetadata(EventArgs e)

        {

            base.FireBeforeBindFilterMetadata(e);

            if (this.Model.BillBusinessInfo != null && this.Model.BillBusinessInfo.GetForm().Id.Equals("PUR_PurchaseOrder", StringComparison.OrdinalIgnoreCase))

            {

                var filterModel = (IListFilterModelService)this.Model;

                // 方案1:移除指定分录,移除了一了百了,不再需要配合AfterBindData事件使用(此方案反射调用了私有变量,未来可能存在兼容性风险,使用需慎重)

                // EntityObject._filterEntities定义:Dictionary<string, FilterEntity> _filterEntities

                var filterEntities = (Dictionary<string, FilterEntity>)GetValue(filterModel.EntityObject, "_filterEntities");

                var removeFilterEntityKeys = filterEntities.Keys.Where(o => !showEntityKeys.Contains(o, StringComparer.OrdinalIgnoreCase)).ToArray();

                foreach (var key in removeFilterEntityKeys)

                {

                    filterEntities.Remove(key);

                }


                return;

                // 方案2:不移除指定分录,仅反选和禁用指定分录,需配合AfterBindData事件使用(推荐使用此方案)

                ResetSelectedEntityKeys(filterModel.EntityObject, showEntityKeys);

                // 获取当前单据的所有分录标识

                var entities = this.Model.BillBusinessInfo.Entrys;

                foreach (var entity in entities)

                {

                    var filterEntity = filterModel.EntityObject.GetEntity(entity.Key);

                    if (filterEntity == null)

                    {

                        continue;

                    }


                    if (!showEntityKeys.Contains(filterEntity.Key, StringComparer.OrdinalIgnoreCase))

                    {

                        filterEntity.Selected = false; // 此设置无效,后续版本会修复......

                        filterEntity.Visible = false; // 隐藏前必须先将分录取消勾选

                    }

                }

            }

        }


       

public override void AfterBindData(EventArgs e)

        {

            base.AfterBindData(e);

            if (this.Model.BillBusinessInfo != null && this.Model.BillBusinessInfo.GetForm().Id.Equals("PUR_PurchaseOrder", StringComparison.OrdinalIgnoreCase))

            {

                var filterModel = (IListFilterModelService) this.Model;

                ResetSelectedEntityKeys(filterModel.EntityObject, showEntityKeys);

            }

        }


        /// <summary>

        /// 不可见的分录,取消勾选

        /// </summary>

        /// <param name="entityObject"></param>

        /// <param name="showEntityKeys"></param>

        private static void ResetSelectedEntityKeys(EntityObject entityObject, string[] showEntityKeys)

        {

            var selectedEntityKeys = entityObject.Setting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();

            selectedEntityKeys.RemoveAll(o => !showEntityKeys.Contains(o, StringComparer.OrdinalIgnoreCase));

            entityObject.Setting = "," + string.Join(",", selectedEntityKeys) + ",";

        }


        /// <summary>

        /// 反射获取对象的某个变量值

        /// </summary>

        /// <param name="obj"></param>

        /// <param name="propertyName"></param>

        /// <returns></returns>

        private static object GetValue(object obj, string propertyName)

        {

            var field = obj.GetType().GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);

            if (field != null)

            {

                return field.GetValue(obj);

            }


            return null;

        }

    }

}


<2>编写列表插件,代码如下。

using Kingdee.BOS.Core.List.PlugIn;

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

using Kingdee.BOS.Core.ListFilter;

using Kingdee.BOS.Util;

using System;

using System.ComponentModel;

using System.Linq;


namespace Jac.XkDemo.BOS.Business.PlugIn

{

    /// <summary>

    /// 【列表插件】快捷过滤隐藏指定分录下的字段

    /// </summary>

    [Description("【列表插件】快捷过滤隐藏指定分录下的字段"), HotUpdate]

    public class HideQuickFilterFieldListPlugIn : AbstractListPlugIn

    {

        public override void AfterCreateFilterField(AfterCreateFilterFieldEventArgs e)

        {

            base.AfterCreateFilterField(e);

            var listFilterModel = this.View.GetService<IListFilterModelService>();

            var showEntityKeys = new[] { "FBillHead" };

            listFilterModel.QuickFilterObject.AllFilterFieldList.RemoveAll(o => !showEntityKeys.Contains(o.EntityKey, StringComparer.OrdinalIgnoreCase));

        }

    }

}


<3>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<4>BOSIDE扩展列表过滤(带组织)[BOS_OrgIsolationFilter],注册表单插件。


<5>BOSIDE扩展采购订单,注册列表插件,保存元数据,开发完毕。




现在可以登录业务站点,打开采购订单列表界面,再打开过滤界面,检验一下插件效果啦。

列表过滤界面仅显示基本信息分录及其字段:

列表快捷过滤界面仅显示基本信息分录下的字段:




【知识点】

<1>如何获取指定单据的过滤窗体业务对象?

运行时:

设计时:

此处为空表示该业务对象使用的是默认过滤窗体,实际以运行时看到的formid为准。

---------------------------------------------------------------------------------------------------------
















【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

【过滤插件】列表过滤窗体上隐藏分录.rar

二开案例.过滤插件.列表过滤窗体上隐藏分录

【应用场景】列表过滤窗体上隐藏分录,同时将该分录的字段在过滤条件的字段集合中移除。【案例演示】采购订单列表过滤界面,仅显示单据头【...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息