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
相关产品推荐
相关产品推荐

