在 Dynamics CRM 基于条件的可编辑子网格中禁用列
我需要禁用(设为只读)Dynamics CRM 365 表单中可编辑子网格中的列。
在 MS doc (https://learn.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。
最重要的事情:
Xrm.Page
已弃用,您必须开始使用context.getFormContext()
。
不幸的是,可编辑网格控件和内部事物在表单加载时并未完全呈现,我们必须依赖
OnRecordSelect
事件。
出于性能原因,可编辑网格中的行(记录)在选择记录之前不可编辑。用户必须选择网格中的单个记录才能对其进行编辑。在可编辑网格中选择记录后,Dynamics 365 会在内部评估一系列内容,包括用户对记录的访问权限、记录是否处于活动状态以及字段验证,以确保在编辑数据时尊重数据的安全性和有效性。考虑使用 OnRecordSelect 事件和 getFormContext 方法来访问网格中处于可编辑状态的记录。
解决方法(可用解决方案)是在
OnRecordSelect
事件上使用以下代码片段。
function gridRowSelected(context) {
context.getFormContext().getData().getEntity().attributes.forEach(function (attr) {
if (attr.getName() === "new_fieldname") {
attr.controls.forEach(function (c) {
c.setDisabled(true);
})
}
});
}