二开案例.过滤插件.列表过滤窗体上隐藏分录
【应用场景】列表过滤窗体上隐藏分录,同时将该分录的字段在过滤条件的字段集合中移除。
【案例演示】采购订单列表过滤界面,仅显示单据头【基本信息】,其它分录全部隐藏,对应字段也在过滤,高级过滤,快捷过滤的字段集合中移除。
【解决方案】
<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
二开案例.过滤插件.列表过滤窗体上隐藏分录
本文2024-09-23 04:20:10发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164649.html