Dynamics CRM可编辑网格中setValue方法无法生效的问题求助
解决Dynamics CRM 365本地部署可编辑网格中setValue方法不生效的问题
你遇到的问题很典型——在可编辑网格里直接调用实体属性的setValue只会修改内存中的数据,不会自动触发网格的UI更新和脏数据标记,所以看起来像是没生效。我来帮你调整代码并说明关键要点:
核心问题分析
- 你当前用
getRows()获取的是网格所有行,但注释里写的是要获取选中行,应该改用getSelectedRows() - 修改属性值后,没有标记实体为“已修改”,网格无法感知数据变化
- 未刷新行/网格,导致UI不更新修改后的值
修正后的代码
function updateDocsOK(ctlName, grdName, attributeName) { var selectedRows = null; var twoOptionValue = 0; try { // 获取下拉框的Yes/No值(1=Yes,0=No) var ctlValue = Xrm.Page.getAttribute(ctlName).getValue(); if (ctlValue) { twoOptionValue = 1; } // 正确获取选中的行 selectedRows = Xrm.Page.getControl(grdName).getGrid().getSelectedRows(); // 遍历选中行进行更新 selectedRows.forEach(function (row, rowIndex) { var entity = row.getData().getEntity(); // 更新双选项字段 var att = entity.attributes.getByName(attributeName); if (att) { console.log("原始值: ", att.getValue()); att.setValue(twoOptionValue); console.log("修改后的值: ", att.getValue()); // 标记实体为已修改,让系统感知到变化 entity.setIsDirty(true); } // 更新文本字段 att = entity.attributes.getByName("new_testtext"); if (att) { att.setValue("hello"); entity.setIsDirty(true); } // 刷新当前行,立即在UI上显示修改后的值 row.refresh(); }); // 可选:刷新整个网格确保所有变化同步 Xrm.Page.getControl(grdName).refresh(); } catch (e) { Xrm.Utility.alertDialog(e.message); } }
额外注意事项
- 检查网格可编辑配置:在CRM表单设计器中,确认目标字段所在的网格列已经设置为「可编辑」,否则即使代码修改了值,网格也不会允许编辑显示
- 权限验证:确保当前登录用户对该实体的目标字段有编辑权限,否则
setValue会静默失败 - 字段类型匹配:双选项字段的值固定为
0(否)和1(是),你的代码这里是正确的,但要确保传入的attributeName确实是双选项类型字段 - 保存到服务器:如果需要立即将修改同步到数据库,可以在遍历结束后调用
Xrm.Page.data.save(),或者针对单个实体调用entity.save()(注意这是异步操作,需要处理回调)
内容的提问来源于stack exchange,提问作者Dave S
相关产品推荐
相关产品推荐

