在 Dynamics 365 模型驱动应用(Model-driven App) 中,可编辑子网格(Editable Subgrid) 为数据录入提供了非常高效的体验。 但在某些业务场景下,我们可能希望:子网格整体可编辑,但部分列只读,或在特定时机(如选中行后),临时禁止编辑。

遗憾的是,D365 并没有提供开箱即用的方式来控制可编辑子网格中单个列的只读状态。因此,通常需要通过 JavaScript(Client API) 在子网格行被选中时动态控制字段的可编辑性。

本文将介绍两种常见实现方式:

  1. 将子网格中所有列设置为只读
  2. 仅将指定列设置为只读

全部列设置为只读

下面的示例中,在子网格行被选中时,遍历当前行的所有字段,并将其对应的控件统一设置为只读。

Disabled_XXXXX_SubGridOnSelect: function (ExecutionContext) {
    let that = this;
    let objFormContext = ExecutionContext.getFormContext();
    let entObject = objFormContext.data.entity;
    entObject.attributes.forEach(function (attribute) {
            let allColumnControl = attribute.controls.get(0);
            allColumnControl.setDisabled(true);
        });
}

指定列设置为只读

如果只需要控制部分字段,可以根据字段的 Logical Name 进行判断

Disabled_XXXXX_SubGridOnSelect: function (ExecutionContext) {
    let objFormContext = ExecutionContext.getFormContext();
    let entObject = objFormContext.data.entity;
    entObject.attributes.forEach(function (attribute) {
        let columnName = attribute.getName();
        if (
            columnName == "your field name 1" ||
            columnName == "your field name 2" ||
            columnName == "your field name 3" ||
            columnName == "your field name 4" ||
            columnName == "your field name 5" ||
            columnName == "your field name 6") {
            attribute.controls.get(0).setDisabled(true);
        }
    });
}

事件绑定方式

打开目标表单,选中 可编辑子网格,为其绑定上述 JavaScript 方法。

需要注意两点:

  1. 事件选择:On Record Select
  2. 勾选:将执行上下文作为第一个参数传递

Bind JavaScript to Editable Subgrid

如果本文对你有所帮助,可以请我喝杯咖啡

(完)