hahahhahaha

Dynamics CRM记录页面上隐藏子网格“+”标识

前段时间微软发布了Dynamics 365,这是Dynamics产品的又一次大的变动,期待新的版本能够更好的满足客户的需求,同时提供更多的可定制化的内容。

 

近期做Dynamics CRM项目遇到很多审批的业务,用户A提交审批给用户B,这时如果审批记录没有做分派即审批记录的负责人没有发生改变,通常情况下都会把审批记录对申请人不可编辑。

常见的做法是:依据记录的审批状态,在记录页面加载时使用JS方法,遍历停用页面上的所有控件。

但会遇到一个问题,子网格是无法停用的,子网格右上角的”+”仍然可以点击,仍然可以在子网格中直接删除关联记录,该如何处理呢?

 

我接触到处理方法:

1、  在页面加载完成后,使用JS方法隐藏”+”对应的div。(这不是官方支持的方法,而且如果系统升级,随时可能失效)。

2、  对子网格实体添加插件,当用户编辑子网格数据的时候,通过插件去做检验,抛异常告诉用户该子网格不可编辑。(这种方式用户体验度不是很好,并且增加了开发人员的工作量)。

 

下边我以报销申请为例介绍一种官方支持的方式:

 

实现思路:

为 ”+” 按钮添加JS可用规则,当审批条件不是草稿时不显示。

 

首先,我们先看下申请页面处理后的效果,图中 报销申请:案例 = 1:N

 

具体的操作:

 

1、  在报销页面上添加“审批状态”字段。

 

2、  使用Ribbon Workbench 为 案例 实体的新建、删除、编辑等按钮添加可用规则。

 

 

 

配置好脚本及脚本方法HideSunGridBtn.subGridBtnEnRule

 

 

 

为各按钮添加可用规则

 

 

 

 

最后,发布解决方案。

 

 

JS代码:

 

var FORM_TYPE_CREATE = 1;

var FORM_TYPE_UPDATE = 2;

 

var HideSunGridBtn = (function () {

    return {

        //页面的onload方法

        onload: function () {

            //审批状态

            var statusValue = Xrm.Page.getAttribute("new_status").getValue();

            //不是草稿状态时停用所有控件

            if (statusValue != 1) {

                HideSunGridBtn.DisableFormFields();

            }

 

        },

 

        //停用子网格上的“+”和删除功能

        subGridBtnEnRule: function () {

            var statusValue = Xrm.Page.getAttribute("new_status").getValue();

            var statecode = Xrm.Page.getAttribute("statecode").getValue();

            var formType = Xrm.Page.ui.getFormType();

            //审批状态=草稿 状态=可用  窗体类型=2

            if (statusValue == 1 && statecode == 0 && formType == FORM_TYPE_UPDATE) {

                return true;

            }

            return false;

        },

 

        //停用页面上的所有控件

        DisableFormFields: function () {

            Xrm.Page.ui.controls.forEach(function (control, index) {

                if (HideSunGridBtn.DoesControlHaveAttribute(control)) {

                    control.setDisabled(true);

                }

            });

        },

 

        DoesControlHaveAttribute: function (control) {

            var controlType = control.getControlType();

            return controlType != "iframe" && controlType != "webresource" && controlType != "subgrid";

        }

    };

})();

 

posted @ 2016-11-20 13:45  SupermanBlog  阅读(1950)  评论(2编辑  收藏  举报