You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dynamics AX 2012中如何设置表单网格的默认列位置?

固定Dynamics 365 FO表单Grid列顺序的X++实现方案

要强制Grid列顺序不受用户个性化设置影响,可在表单的init方法中通过X++代码重置列配置,核心思路是清除用户个性化设置后,按指定顺序重新添加字段列。

核心步骤

  • 获取目标Grid控件实例
  • 清除该Grid的所有用户个性化设置
  • 移除Grid原有列(可选,避免字段组默认顺序干扰)
  • 按需求顺序添加来自两个表的字段
  • 刷新Grid应用配置

代码示例

假设表单名为MyForm,Grid控件名为MyGrid,涉及表TableA(字段组GroupA)和TableB(字段组GroupB),需要的列顺序为TableA.Field1 → TableA.Field2 → TableB.Field3 → TableB.Field4:

public void init()
{
    FormGridControl       gridControl;
    FormDataField         formDataField;
    DictTable             dictTableA, dictTableB;
    DictField             dictField;
    int                   columnCount, i;
    int                   columnOrder = 1;

    super();

    // 获取目标Grid控件
    gridControl = element.control(element.controlId(formStr(MyForm, MyGrid)));
    if (!gridControl) return;

    // 清除用户个性化设置,重置为默认状态
    gridControl.clearPersonalization();

    // 移除Grid中所有现有列,避免字段组默认顺序干扰
    columnCount = gridControl.columnCount();
    for (i = columnCount; i >= 1; i--)
    {
        gridControl.removeColumn(i);
    }

    // 添加TableA的字段,按指定顺序排列
    dictTableA = new DictTable(tableNum(TableA));
    if (dictTableA)
    {
        // 添加TableA.Field1
        dictField = dictTableA.fieldName2Id(fieldStr(TableA, Field1));
        if (dictField)
        {
            formDataField = gridControl.addDataField(dictTableA.id(), dictField.id());
            formDataField.columnOrder(columnOrder++);
            formDataField.visible(true);
        }

        // 添加TableA.Field2
        dictField = dictTableA.fieldName2Id(fieldStr(TableA, Field2));
        if (dictField)
        {
            formDataField = gridControl.addDataField(dictTableA.id(), dictField.id());
            formDataField.columnOrder(columnOrder++);
            formDataField.visible(true);
        }
    }

    // 添加TableB的字段,按指定顺序排列
    dictTableB = new DictTable(tableNum(TableB));
    if (dictTableB)
    {
        // 添加TableB.Field3
        dictField = dictTableB.fieldName2Id(fieldStr(TableB, Field3));
        if (dictField)
        {
            formDataField = gridControl.addDataField(dictTableB.id(), dictField.id());
            formDataField.columnOrder(columnOrder++);
            formDataField.visible(true);
        }

        // 添加TableB.Field4
        dictField = dictTableB.fieldName2Id(fieldStr(TableB, Field4));
        if (dictField)
        {
            formDataField = gridControl.addDataField(dictTableB.id(), dictField.id());
            formDataField.columnOrder(columnOrder++);
            formDataField.visible(true);
        }
    }

    // 刷新Grid应用新的列配置
    gridControl.refresh();
}

扩展说明

  • 处理字段组所有字段:如果需要保留字段组中的全部字段但调整顺序,可通过dictTable.fieldGroupFields()获取字段组的字段集合,整理顺序后再添加:
    // 获取TableA.GroupA的所有字段
    container groupFields = dictTableA.fieldGroupFields(fieldGroupStr(TableA, GroupA));
    int fieldIdx;
    for (fieldIdx = 1; fieldIdx <= conLen(groupFields); fieldIdx++)
    {
        dictField = new DictField(dictTableA.id(), conPeek(groupFields, fieldIdx));
        if (dictField)
        {
            // 按自定义逻辑调整添加顺序
            // 示例:跳过不需要的字段,或重新排序
            formDataField = gridControl.addDataField(dictTableA.id(), dictField.id());
            formDataField.columnOrder(columnOrder++);
            formDataField.visible(true);
        }
    }
    
  • 关键方法解析:
    • clearPersonalization():清除用户对该Grid的列顺序、宽度、隐藏状态等个性化设置
    • addDataField():向Grid添加指定表的字段,返回对应的列控件对象
    • columnOrder():设置列的显示顺序,数值越小越靠左
  • 注意事项:替换代码中的表单、Grid、表和字段名称为实际业务对象;测试时确保用户无个性化锁定权限,否则可能无法生效。

内容的提问来源于stack exchange,提问作者omkar_erp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:23:18