CRM 4.0 里的下拉列表控件(PickList)只能存储单一的值,虽然我们可以通过设置 crmForm.all.new_picklist.multiple = true; 来实现多选功能,但用户必须按住CTRL键来逐个选择,效果并不好。我现在这个项目需要一些能够多选的PickList,所以我打算写一个通用的能被用户认可的控件,并且Keep It Simple and Generic! 便于修改和重用。

使用方法非常简单:

1. 创建一个标准的Picklist attribute,并且填入所有的列表项,放在窗体上。比如叫做:new_picklist;
2. 创建一个nvarchar attribute,放在窗体上,并且隐藏标签。比如叫做:new_picklistvalue,这个attribute是用来存储picklist的选中项的;
3. 把下列代码放到窗体OnLoad() 里面。 

tip: 程序的思路是在窗体上绘制一个CheckBox样式的下拉列表,从picklist里取值,从picklistvalue里取选种的值。这种做法其实没有在picklist里保存任何值,所以对于高级搜索来讲不会搜索到任何内容,建议设置picklist的搜索为“禁止”,同时让用户搜索picklistvalue里的值。虽然用户不得不手工输入要搜索的内容,但是可以保存搜索设置。 

 

/*
  Checkbox style Multi-Select Picklist
  author: Jim Wang @ January 2009
  http://jianwang.blogspot.com
  http://mscrm.cn
*/

// PL - the picklist attribute; PLV - used to save selected picklist values 
var PL = crmForm.all.new_picklist;
var PLV = crmForm.all.new_picklistvalue;

if( PL != null && PLV != null )
{
  PL.style.display 
= "none";
  PLV.style.display 
= "none";
  
  
// Create a DIV container 
  var addDiv = document.createElement("<div style='overflow-y:auto; height:80px;border: 1px #6699cc solid;background-color: #ffffff;' />");
  PL.parentNode.appendChild(addDiv);
  
  
// Initialise checkbox controls
  forvar i = 1; i < PL.options.length; i++ )  
  { 
    
var pOption = PL.options[i];
    
if!IsChecked( pOption.text ) )
      
var addInput = document.createElement("<input type='checkbox' style='border:none; width:25px; align:left;' />" );
    
else
      
var addInput = document.createElement("<input type='checkbox' checked='checked' style='border:none; width:25px; align:left;' / >" );
  
    
var addLabel = document.createElement( "<label />");
    addLabel.innerText 
= pOption.text;
  
    
var addBr = document.createElement( "<br />");
  
    PL.nextSibling.appendChild(addInput);
    PL.nextSibling.appendChild(addLabel);
    PL.nextSibling.appendChild(addBr);
  }
  
  
// Check if it is selected
  function IsChecked( pText )
  {
    
if(PLV.value != "")
    {
      
var PLVT = PLV.value.split("||");
      
forvar i = 0; i < PLVT.length; i++ )  
      { 
        
if( PLVT[i] == pText )
          
return true;
      }  
    }
    
return false;
  }
  
  
// Save the selected text, this filed can also be used in Advanced Find
  crmForm.attachEvent( "onsave" , OnSave);
  
function OnSave()
  {
    PLV.value 
= "";
    
var getInput = PL.nextSibling.getElementsByTagName("input");
  
    
forvar i = 0; i < getInput.length; i++ )  
    {   
      
if( getInput[i].checked)
      {
        PLV.value 
+= getInput[i].nextSibling.innerText + "||";
      }
    }  
  } 
}
posted on 2010-11-04 10:50  Seer Lin  阅读(490)  评论(0编辑  收藏  举报