2016-04-22 239 views
0

我正在使用我在线发现的代码将标准选项集字段转换为MS CRM 2015联机中的复选框。它不断给我上面的错误。无法获取未定义或空引用的属性'new_textholder'

下面是代码:

function MultiPickList3(param1, param2, param3,param4,param5) 
{ 
try 
{ 
var fn = arguments.callee.toString().match(/function\s+([^\s\(]+)/); 

if (param1==null || param2==null) 
{ 
alert("Error: Parameter missing. \n Format: <optionset fieldname> , <option value text field> , [<option header>], [<select color>] , [<deselect color>] , \n ["+"Function="+fn[1]+"]" ); 
return true; 
} 

var tparamtype=Xrm.Page.data.entity.attributes.get(param1).getAttributeType(); 
if (tparamtype!="optionset") 
    { alert (param1+"(first parameter) should be of type optionset \n"+"[function="+fn[1]+"]"); 
    return true; 
    } 

var tparamtype=Xrm.Page.data.entity.attributes.get(param2).getAttributeType(); 
if (tparamtype!="memo") 
    { alert (param2+"(second parameter) should be of type memo (text with mutiline) \n[function="+fn[1]+"]"); 
    return true; 
    } 

var plOptions=param1;  
var plText=param2;  
var plMenuItem="View Selected List"; 
var SelectedList_orig = crmForm.all[plText]; 
var FullList=crmForm.all[plOptions]; 

var SelCtr=-1; 
var new_selColor="orange"; 
var new_deSelColor="white"; 
if (param4!=null) 
    new_selColor=param4; 
if (param5!=null) 
    new_deSelColor=param5; 

var SelectedList =SelectedList_orig.value.split("\r\n"); 
crmForm.all[plText].style.display="none"; 

if(FullList!=null && SelectedList!=null) 
    { 
    initColor(); 
    if (param3!=null && param3!="") 
     { 
      plMenuItem=param3; 
     } 
    else 
     { 
      plMenuItem=FullList.options[0].text; 
      changeColor("grey",0); 
     } 

    for (var ctr=0; ctr<SelectedList.length;ctr++) 
     { 
      selCtr=SelectedIndex(SelectedList[ctr]); 
      if (selCtr >-1) 
       {   
        changeColor(new_selColor,selCtr); 
       } 
     } 
    } 

function SelectedIndex(selectedText) 
{ 
var FullListText; 
for (var ctr1=0; ctr1<FullList.options.length;ctr1++) 
    { 
     FullListText=FullList.options[ctr1].text; 
     if (FullListText==selectedText) 
     { 
      return ctr1; 
     } 
    } 
return -2; 
} 

crmForm.all[plOptions].attachEvent('onchange', OnChangePL); 

function OnChangePL() 
{ 
var SelCtr=-1; 
var sel=crmForm.all[plOptions].SelectedText; 

if (sel==plMenuItem) 
return; 

SelCtr=SelectedIndex(sel); 
var SelColor="grey"; 
SelColor=crmForm.all[plOptions][SelCtr].style.backgroundColor; 

if (SelColor==new_selColor) 
    { 
     changeColor(new_deSelColor,SelCtr); 
     saveChanges(sel,selCtr,"del"); 
    } 
else 
    { 
     changeColor(new_selColor, SelCtr);    
     saveChanges(sel,selCtr,"add"); 
    } 
} 

function saveChanges(p_selText,p_SelCtr,p_mode) 
{ 
switch(p_mode) 
{ 
    case "add": 
      SelectedList.push(p_selText); 
      break; 
    case "del": 
      for (var ctr2=0;ctr2<SelectedList.length;ctr2++) 
       { 
        if (SelectedList[ctr2]==p_selText) 
         { 
         SelectedList.splice(ctr2,1); 
         break; 
         } 
        } 
       break; 
} 
Xrm.Page.getAttribute(plText).setValue(SelectedList.join("\r\n")); 
} 

function initColor() 
{ 
     for (var ctr3=0; ctr3<FullList.options.length;ctr3++) 
      {    changeColor(new_deSelColor, ctr3); } 
} 

function changeColor(newColor, newCtr) 
{ 
     crmForm.all[plOptions][newCtr].style.backgroundColor=newColor; 
} 

} 
catch (e) 
     { alert (e.description);} 
} 

参数2取场“new_textholder”,这是一个多行文本字段。它在表单上定义,我已检查以确保我正确写入它。

可能是什么问题?

谢谢!

+0

该代码中的new_textholder在哪里? – epascarello

+0

它不是。在定义事件处理程序OnLoad时,我定义了从字段中使用的参数。 param2(在函数MultiPickList3的参数列表中)采用“new_textholder”。 –

+0

代码与DOM混淆,当Dynamics CRM的新版本或汇总更新发布时,DOM不受支持并可能会中断。我的建议是不要在这方面做出任何努力。相反,你会设计一个HTML网页资源并将其嵌入到你的表单中。 –

回答

0

此错误可能来自crmForm.all [plText]一行。我猜你的组织已经足够了,老的4.0 api的支持不再存在,这意味着all对象不再可用,这会给你那个错误(plText被设置为param2的值)。您可能可以修改此代码以使用您的2015年表格,但目前我没有2015年的组织,因此我无法确定。

+0

我该如何解决这个问题? –

+0

如果没有2015年的表格,很难说。您可以先查看以下部分链接:https://www.google.com/search?q=upgrade+crm+4.0+javascript+to+2011 – Polshgiant

相关问题