我目前正在开发一个CRM 4.0项目,我创建了34个值的选项列表A和132个值的选项列表B.
领料单B取决于选项列表A中选择的值,其范围为总计132的2到14个值。
以前的开发人员编写了Javascript,它定义了每个选项列表值,并将disabled设置为true或false,但这将使132个值变得混乱 - 见下文..
var picklist = document.getElementById("picklist_b");
if(crmForm.all.picklist_a.value==2)
{
crmForm.SetFieldReqLevel("picklist_b", 2);
picklist[1].disabled = false;
picklist[2].disabled = false;
picklist[3].disabled = false;
picklist[4].disabled = true;
picklist[5].disabled = true;
picklist[6].disabled = true;
您对更好的方法有什么想法吗?
非常感谢...
答案 0 :(得分:0)
最终,您必须告诉系统您希望显示哪些值以及何时需要手动操作。为了给你的工作提供一些结构,你可以这样做:
1)在Picklist A上注册onChange()事件并获取其值:
var picklistA = Xrm.Page.getAttribute("picklistA").getValue();
2)从Picklist B中获取所有可用选项(以节省您的输入):
var options = Xrm.Page.getAttribute("picklistB").getOptions();
3)现在从选项列表B中删除所有选项:
var picklistBControl = Xrm.Page.getControl("optionset");
picklistBControl.clearOptions();
4)定义领料单A值与领料单B值之间的关系(示例):
var mapping = [
{
parent: 550000000,
children: [
660000000, 660000001
]
},
{
parent: 550000001,
children: [
660000003, 660000004
]
}
];
5)通过将Picklist A的值与mapping
数组进行比较,获取所需的新选项:
function getNewOptionValues(picklistA) {
var newOptionValues = function (picklistA) {
return mapping.forEach(function (m) {
if (m.parent == picklistA) {
return m.children;
}
});
}(picklistA);
return newOptionValues;
}
6)从您想要的新选项的值中,将它们构建为有效对象:
function buildNewOptions(oldOptions, newOptionValues) {
var newOptions = [];
for (var option in oldOptions) {
for (var newOption in newOptionValues) {
if (option.value == newOption) {
newOptions.push(option);
}
}
}
return newOptions;
}
7)最后,将新选项添加到领料单B:
function addNewOptions(newOptions, childControl) {
for (var newOption in newOptions) {
childControl.addOption(newOption);
}
}
这些代码中的某些代码可能无法在CRM 4.0中运行,我不记得了。我希望这有助于此。另请注意,需要调用第5,6和7点中的函数(如果您不熟悉JavaScript)。