• Dynamics 365子网格根据条件隐藏新建/添加按钮


    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复405或者20200424可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

    有时候经常碰到子网格的添加按钮需要根据父记录的状态来隐藏,比如只有订单是草稿状态的状态下才能显示订单行的添加按钮,这里我用编辑实体的子网格按钮来控制。

    将子网格对应实体添加到解决方案中后用Ribbon Workbench打开。找到该实体的Subgrid 命令栏,对【ADD NEW {0}】 和 【ADD EXISTING {0}】两个按钮都做同样操作。

    右击,选择【Customize Command】菜单项目,我的截图是灰色的是因为我之前点击过了,你没有点击过的话应该是可以选择的。

    可以看到这两个按钮的id分别类似 Mscrm.SubGrid.new_orderitems.AddNewStandard 和 Mscrm.SubGrid.new_orderitems.AddExistingStandard 。

    然后为他们的命令添加一个相同的Enable Rule,类型为 Custom Rule,我这里设置如下:

    我使用的JavaScript代码是

    "use strict";
    var LuoYong = window.LuoYong || {};
    LuoYong.OrderItemRibbon = LuoYong.OrderItemRibbon || {};
    (function () {
        this.subgridCreateEnableRule = function (primaryControl) {
            var formContext = primaryControl;
            var statusCode = formContext.getAttribute("statuscode").getValue();
            if (statusCode === 1) {
                return true;
            }
            else {
                return false;
            }
        }
    }).call(LuoYong.OrderItemRibbon);
    //# sourceURL=orderitem_ribbon.js

    这样发布后的效果是看不到新建或者添加按钮了:

    下图是修改之前的效果:

     当然可以通过别的方式来添加该订单的订单行,如果要完全限制住不能添加请用插件,比如将如下的代码注册到订单行实体的Pre Create中。

    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;
    using System;
    
    namespace DemoPlugins
    {
        public class orderitemsprecreate : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                //获取日志服务
                ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                //写一些日志,方便跟踪
                tracingService.Trace($"Enter {this.GetType().ToString()} on {DateTime.UtcNow.ToString()}");
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    //插件针对的当前实体记录,对于Pre Create来讲,该对象包括了所有设置的字段值,若字段没有设置值,在该对象中会不存在
                    Entity currentEntity = (Entity)context.InputParameters["Target"];
                    //获取组织服务
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService orgSvc = serviceFactory.CreateOrganizationService(context.UserId);
                    if (currentEntity.Contains("new_orderid") && currentEntity.GetAttributeValue<EntityReference>("new_orderid") != null)
                    {
                        var orderEntity = orgSvc.Retrieve("new_order", currentEntity.GetAttributeValue<EntityReference>("new_orderid").Id, new ColumnSet("statuscode"));
                        if(orderEntity.GetAttributeValue<OptionSetValue>("statuscode").Value != 1)
                        {
                            throw new InvalidPluginExecutionException("所属订单非草稿状态,不允许增加订单行!");
                        }
                    }
                    else
                    {
                        throw new InvalidPluginExecutionException("所属订单必须输入!");
                    }
                }
                tracingService.Trace($"Leave {this.GetType().ToString()} on {DateTime.UtcNow.ToString()}");
            }
        }
    }

    这样的话,通过其他方式添加也会报错,界面上的效果如下:

  • 相关阅读:
    数据库MySQL调优实战经验总结
    Apache常见功能实战详解
    使用HeartBeat实现高可用HA的配置过程详解
    Nginx实现集群的负载均衡配置过程详解
    CentOS系统通过PXE实现批量无人值守安装
    CentOS 7 网卡命名修改为eth0格式
    Nagios 系统监控基本安装配置过程详解
    LAMP 系统服务搭建过程详解
    使用 python 管理 mysql 开发工具箱
    C++标准库string类型的使用和操作总结
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Conditional_Hide_Add_New_Button_In_Subgrid.html
Copyright © 2020-2023  润新知