1

根据条件禁用Dynamics CRM可编辑子网格中的列

我需要禁用(设为只读)Dynamics CRM 365 表单中可编辑子网格的列。

在 MS 文档(https://docs.microsoft.com/en-us/previous-versions/dynamicscrm-2016/developers-guide/mt788311(v=crm.8)中,完成此操作的方法是使用:

Xrm.Page.getControl("Opportunity_Installments").getGrid().getRows().getAll()[0].getData().entity.attributes.getAll()[0].controls

但问题是控件数组始终为空,因此我无法禁用该列(setDisable在控件上应用函数)

在 IE 控制台中,表达式Xrm.Page.getControl("Opportunity_Installments").getGrid().getRows().getAll()[0].getData().entity.attributes.getAll()[0].controls返回 null。

4

1 回答 1

2

最重要的是Xrm.Page已弃用,您必须开始使用context.getFormContext().

不幸的是,可编辑的网格控件和内部事物并没有完全在表单加载时呈现,我们必须依赖OnRowSelect事件。

出于性能原因,可编辑网格中的行(记录)在选择记录之前不可编辑。用户必须在网格中选择一条记录才能对其进行编辑。在可编辑网格中选择记录后,Dynamics 365 会在内部评估一系列内容,包括用户对记录的访问权限、记录是否处于活动状态以及字段验证,以确保在您编辑数据时遵守数据安全性和有效性。考虑使用带有 getFormContext 方法的 OnRecordSelect 事件来访问网格中处于可编辑状态的记录。

参考

解决方法(可用的解决方案)是在OnRowSelect事件中使用以下代码段。

function gridRowSelected(context) {
    context.getFormContext().getData().getEntity().attributes.forEach(function (attr) {
        if (attr.getName() === "new_fieldname") {
            attr.controls.forEach(function (c) {
                c.setDisabled(true);
            })
        }
    });
}

阅读更多

于 2019-08-28T13:54:55.423 回答