今天遇到了一个需求:在状态描述字段为特定值时 需要将Form设置为disabled.
查了一下sdk发现没有这个功能。
bing了一下找打了一个可以直接使用的代码。
参考链接如下:http://xrmguy.com/2014/03/03/crm-2013-make-all-controls-including-subgrids-disabled-onload/
因为subgrid控件不能直接disabled掉(CRM2011可以)。
所以想了一个折中办法,将subgrid上方的【+】与 【显示详细】按钮给隐藏掉。
但是对于subgrid中每行右侧的【删除】按钮并没有隐藏掉,考虑到实际用户使用中不会被分配删除权限。
对于ribbon直接设置ribbon规则即可。
代码如下:
///<summary>
//当【工单】实体中的【状态描述】字段的值不为
//【100000005 驳回】、【100000000 草稿】时需要将表单中所有字段设置为Disabled
///</summary>
PetroCRM.Main.Equip.Serviceworkorder.SetFormDisabled = function () {
//取得【状态描述】的值
var statuscode = Xrm.Page.getAttribute("statuscode").getValue();
// 状态描述为【100000005 驳回】、【100000000 草稿】时直接退出
if (100000005 == statuscode || 100000000 == statuscode) {
return;
}
makeReadOnly();
}
var intervalId;
function makeReadOnly() {
try {
var subgridsLoaded = false;
Xrm.Page.ui.controls.get().forEach(function (control, index) {
// formtype=3 readonly
if (control.setDisabled && Xrm.Page.ui.getFormType() != 3) {
control.setDisabled(true);
}
else {
removeAddButtonFromSubGrid(control);
subgridsLoaded = true;
}
});
if ($("div[id$='_crmGridTD']").length > 0 && !subgridsLoaded) {
intervalId = setInterval(function () {
var subgridsArr = Xrm.Page.getControl(function (control, index) {
return control.getControlType() == 'subgrid';
});
subgridsArr.forEach(function (control, index) {
removeButtonsFromSubGrid(control);
});
}, 500);
}
}
catch (e) {
alert("makeReadOnly() Error: " + e.message);
}
}
function removeButtonsFromSubGrid(subgridControl) {
if (intervalId) {
var addIamgeButton = $('#' + subgridControl.getName() + '_addImageButton');
if (addIamgeButton != null && addIamgeButton != undefined) {
addIamgeButton.css('display', 'none');
}
var associatedGridView = $('#' + subgridControl.getName() + '_openAssociatedGridViewImageButton');
if (associatedGridView != null && associatedGridView != undefined) {
associatedGridView.css('display', 'none');
}
clearInterval(intervalId);
}
}