由于从Microsoft Dynamics CRM 2011到Microsoft Dynamics CRM 2013,界面的风格发生了很大的变化

故原先在2011上开发的选项集多选在2013上面已经不再适用.

一直想不明白的是,微软为啥还不支持选项集的多选呢?

折腾的一番,具体效果如下,但还有很多不满意的地方,希望有兴趣的,或者已经做过类似功能的各位,提供下宝贵的意见,不甚感激!

具体使用步骤如下:

1.创建选项集字段,文本型字段各一个

本文使用的字段名分别为:new_post(选项集),new_post_value(保存多选值的文本型字段)

2.在窗体的OnLoad事件中添加ConvertToMultiPicklist事件,详细代码如下

//表单加载时转化单选为多选
function ConvertToMultiPicklist(entityName, fieldSchema) { var picklistValue = $("#" + fieldSchema + "" + "_value" + "").text(); //step1:通过SOAP获取picklist的value,text列表(返回类型为Object Array,格式为[100000000,测试text])
var optionSetValueList = GetOptionSet1(entityName, fieldSchema, 2052, false); if (optionSetValueList != null && optionSetValueList.length > 0) { //step2.1:先清空原先picklist的内容(html)
$("#" + fieldSchema + "" + "_d" + "").html(""); //step2.2:开始构建多选所需的html
var appendHtml = "";
//border:1px solid #f3f1f2;
appendHtml += "<div style=\"padding-top:0px;padding-left:0px;padding-bottom:20px;padding-right:20px; margin-left:15px;\">";
appendHtml += "<ul style=\"list-style:none;\">"; for (var i = 0; i < optionSetValueList.length; i++) {
var checkboxId = "cb_" + fieldSchema + "_" + i;
appendHtml += "<li style=\"float:left;display:block;padding-left:5px;\">";
appendHtml += "<input type=\"checkbox\" value=\"" + optionSetValueList[i][0] + "\" style=\"width:auto;\" class=\"" + fieldSchema + "\" id=\"" + checkboxId + "\" "; //step2.3:加载已经保存的选项
if (picklistValue.indexOf(optionSetValueList[i][0] + ":" + optionSetValueList[i][1] + ";") > -1) {
appendHtml += "checked=\"checked\"";
} appendHtml += "/>"; appendHtml += "<label for=\"" + checkboxId + "\">" + optionSetValueList[i][1] + "</label>";
appendHtml += "</li>";
} appendHtml += "</ul>";
appendHtml += "</div>"; //step3:用构建好的html替换原先的picklist的html
$("#" + fieldSchema + "" + "_d" + "").html(appendHtml); }
}

与ConvertToMultiPicklist函数相关其他函数如下

function GetOptionSet1(entitySchema, attributeSchema, languageCode, mode) {

    var xmlHttpRequest = RetrieveAttribute(entitySchema, attributeSchema, mode);

    var optionSet = [];
if (xmlHttpRequest.status == 200) { //将responseText转为responseXml
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.async = false;
xmlDoc.loadXML(xmlHttpRequest.responseText);
oXml = xmlDoc; var optionMetadataNodes = oXml.selectNodes("//c:OptionMetadata");
for (var i = 0; i < optionMetadataNodes.length; i++) {
optionSet[i] = [];
optionSet[i][0] = optionMetadataNodes[i].selectSingleNode("c:Value").text;
optionSet[i][1] = "";
var localizedLabelsData = optionMetadataNodes[i].selectSingleNode("c:Label/a:LocalizedLabels");
for (var j = 0; j < localizedLabelsData.childNodes.length; j++) {
var localizedLabelData = localizedLabelsData.childNodes[j];
if (localizedLabelData.selectSingleNode("a:LanguageCode").text == languageCode) {
optionSet[i][1] = localizedLabelData.selectSingleNode("a:Label").text;
}
}
}
}
else {
var errorMessage = ParseError(xmlHttpRequest.responseXML);
alert("获取选项集集合失败,错误信息:" + errorMessage);
}
return optionSet;
}

  

不知啥原因,在调用GetOptionSet1,获取httpXmlRequest.responseXml的时候,一直出现未明的错误..而responseText则是正常的,故上面用的是responseText,然后再把responseText转为responseXml(转换过程中用到了ActiveXObject,所以,以上方法暂时只支持IE)

//内部函数 获取属性MetaData
function RetrieveAttribute(entitySchema, attributeSchema, mode) {
var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body>";
request += "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
request += "<request i:type=\"a:RetrieveAttributeRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
request += "<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>MetadataId</b:key>";
request += "<b:value i:type=\"c:guid\" xmlns:c=\"http://schemas.microsoft.com/2003/10/Serialization/\">00000000-0000-0000-0000-000000000000</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>RetrieveAsIfPublished</b:key>";
request += "<b:value i:type=\"c:boolean\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">true</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>EntityLogicalName</b:key>";
request += "<b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + entitySchema + "</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>LogicalName</b:key>";
request += "<b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + attributeSchema + "</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "</a:Parameters>";
request += "<a:RequestId i:nil=\"true\" />";
request += "<a:RequestName>RetrieveAttribute</a:RequestName>";
request += "</request>";
request += "</Execute>";
request += "</s:Body></s:Envelope>"; var serverUrl = this.GetServerUrl(); var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open("POST", serverUrl + "/XRMServices/2011/Organization.svc" + "/web", mode);
xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", request.length);
xmlHttpRequest.send(request); return xmlHttpRequest;
}

 

相信看到这里,聪明的你已经会有如此的疑问:不过一个小小的功能,为啥要用SOAP的方式去获取选项集的内容?

答案:

其实我也不想的.原先的代码是直接在窗体加载的时候,去获取之前定义好的new_post(选项集)的option,可在做完这个之后,发现,在IE8,IE9,Chrome下面,居然没效果?

由于我的系统是win8,故用的是IE10.所以在开发过程中一直没发现问题的所在.

琢磨了许久,发现2013在加载控件的时候,首先加载的是一个div层,当你点击div之后,才会加载选项集的select.然而,在IE8,IE9,Chrome下面,选项集的select在页面onload完之后并没有马上出现,而是在onload完之后,大概接近1分钟后,dom才会去加载选项集的selec.而IE10却没有这样的情况.

不得已的情况下,才采用上面的方式.

另外附上原先的情况代码:

 //表单加载时转化单选为多选
function ConvertToMultiPicklist(fieldSchema) { var picklist = document.getElementById(fieldSchema);
var picklistValue = document.getElementById(fieldSchema + "_value").innerText; if (picklist != null && picklistValue != null) { //step1:获取原始picklist
originalSelectOption = document.getElementById(fieldSchema + "_i"); if (originalSelectOption != null && originalSelectOption != undefined) { var checkBoxHtml = ""; var originalChildCount = originalSelectOption.parentElement.childElementCount; var originalSelectOptionClone = originalSelectOption; var selectOptionWrap = document.getElementById(fieldSchema + "_d"); //step2:移除td下的子节点
for (var i = 0; i < selectOptionWrap.childElementCount ; i++) {
selectOptionWrap.removeChild(selectOptionWrap.childNodes[0]);
} //↓step3:开始构建多选所需的HTML标签---begin
var divAdd = document.createElement("div");
//divAdd.style.border = "1px solid #f3f1f2";
divAdd.style.paddingTop = "0px";
divAdd.style.paddingRight = "20px";
divAdd.style.paddingBottom = "20px";
divAdd.style.paddingLeft = "0px";
divAdd.style.marginLeft = "15px"; var ulAdd = document.createElement("ul");
ulAdd.style.listStyle = "none"; for (var i = 1; i < originalSelectOptionClone.childNodes.length; i++) {
var checkboxId = "cb_" + fieldSchema + "_" + i; var liAdd = document.createElement("li");
liAdd.style.cssFloat = "left";
liAdd.style.display = "block";
liAdd.style.paddingLeft = "5px"; var checkboxAdd = document.createElement("input");
checkboxAdd.type = "checkbox";
checkboxAdd.id = checkboxId;
checkboxAdd.value = originalSelectOptionClone[i].value;
checkboxAdd.style.width = "auto";
checkboxAdd.className = fieldSchema; var labelAdd = document.createElement("label");
////labelAdd.for = checkboxId;// 这样写不知为何不起效果
////labelAdd.setAttribute("for", checkboxId);
labelAdd.innerText = originalSelectOptionClone[i].text; if (picklistValue.indexOf(checkboxAdd.value + ":" + labelAdd.innerText+";")>-1) {
checkboxAdd.checked = "checked";
} liAdd.appendChild(checkboxAdd);
liAdd.appendChild(labelAdd);
ulAdd.appendChild(liAdd); } divAdd.appendChild(ulAdd);
selectOptionWrap.appendChild(divAdd);
//↑step3:开始构建多选所需的HTML标签---end }
}
}

3.最后,还需要一个OnSave事件,如下

//表单保存时保存多选值
function SaveMultiPicklist(fieldSchema) { //var checkBoxList = document.getElementsByClassName(fieldSchema); //if (checkBoxList.length <= 0) return; //var saveValues = ""; //for (var i = 0; i < checkBoxList.length; i++) {
// if (checkBoxList[i].checked) {
// saveValues += checkBoxList[i].value + ":" + checkBoxList[i].nextSibling.innerText + ";";
// }
//}
  //由于IE8不支持getElemenetsByClassName,故采取下面的方式 2014年1月3日 13:54:44

  

    var saveValues = "";

    $("." + fieldSchema).each(function () {
    if (this.checked) {
      saveValues +=this.value + ":" + this.nextSibling.innerText + ";";
    }
    });


Xrm.Page.getAttribute(fieldSchema + "_value").setValue(saveValues); }

其中,new_post_value字段保存的文本格式如100000000:密码修改;100000001:会员注册;100000002:活动查询

最后,由于从vs2012开始,微软已经在其web项目集成了jQuery,故,在crm2013里,可以不引用jQuery类库了.这个确实很方面.(2013里集成的jQuery版本为1.7.2,就现在的版本来说)

最最后,希望以上内容能够帮到看到此文章的各位.同时,若有更好的解决方法,希望能不吝赐教.在此谢过!

Microsoft Dynamics CRM 2013 --选项集的多选的更多相关文章

  1. Microsoft Dynamics CRM 2013 --针对特定实体,取消保存功能(包含自动保存)

    AutoSave 是 Microsoft Dynamics CRM 2013 一个新特性. 但AutoSave的有效范围是[所有实体],不允许针对特定某一实体进行设置. 所以,若想针对特定实体进行设置 ...

  2. Microsoft Dynamics CRM 2013 and 2011 Update Rollups and Service Packs

      Microsoft Dynamics CRM 2013   BTW: RC stands for Release for Candidate, and RTM stands for Release ...

  3. Microsoft Dynamics CRM 2013 安装程序及SDK 下载地址

    Microsoft Dynamics CRM 2013 已经具有相关资料 2013 Setup (Microsoft Dynamics CRM Server 2013) 下载地址: http://ww ...

  4. Microsoft Dynamics CRM 2013 安装过程图解及安装序列号

    Microsoft Dynamics CRM 2013 安装过程 图解   在安装前,先持一下SQL配置管理,将相关的服务打开.(由于在虚拟机里,许多服务需要时才会打开,像Reporting Serv ...

  5. Microsoft Dynamics CRM 2013 相关安装包下载

    90-day trial keys:Microsoft Dynamics CRM Workgroup Server 2013 (5 CAL limit):NX77Y-BTBCV-JP3T3-8W7JH ...

  6. 从 Microsoft Dynamics CRM 4.0 server迁移到 Microsoft Dynamics CRM 2013 Server

    不能就地升级早于 Microsoft Dynamics CRM Server 2011 的版本号,比方 Microsoft Dynamics CRM 4.0 server.可是,能够在升级过程中使用 ...

  7. Microsoft Dynamics CRM 2013 for Outlook 的硬件要求

    当仅联机或脱机模式下执行 Microsoft Dynamics CRM 2013 for Microsoft Office Outlook 时,下表列出了建议的最低硬件要求 watermark/2/t ...

  8. Dynamics CRM存放选项集记录的表

    我们在做一些自定义查询的时候会去查询选项集字段的值,但是实体的选项集字段是一个整型字段,直接查询并不能找到对应的选项集的显示内容.所以我们需要找到存放选项集键值对的表来做关联查询找到我们想要的值. D ...

  9. Microsoft Dynamics CRM 2013 安装过程 图解

    在安装前,先持一下SQL配置管理,将相关的服务打开.(由于在虚拟机里,许多服务需要时才会打开,像Reporting Services需要处理报表时才打开) 注:Analysis Services 登录 ...

随机推荐

  1. SharePoint 2013中以其他用户身份登录的WebPart(免费下载)

    在SharePoint 2013中微软并没有提供在SharePoint 2010中以其他用户身份登录的菜单,这对一般用户影响不大,但对于系统管理员或测试人员或特定人员(如在OA系统中的文员或秘书,常常 ...

  2. 一点一滴之NHibernate

    之前介绍了Dapper,速度很快,很轻量,很好用. 但是Dapper其实有自己的弊端,比如在数据关系复杂,数据库表非常多,多数据库支持,数据库结构变动频繁的时候总是很无奈.尽管有代码生成器,但是代码生 ...

  3. Win10系统下编译GDAL1.9.2版本

    环境说明: 1.Win10企业版.64位: 2.VS2012旗舰版: 3.GDAL1.9.2 GADL编译 1.解压GDAL压缩包至F:\GDAL\gdal-1.9.2: 2.设置GDAL编译后安装目 ...

  4. HTTP 错误 503.2 - Service Unavailable 正在超过 serverRuntime@appConcurrentRequestLimit 设置的值。

    HTTP 错误 503.2 - Service Unavailable 正在超过 serverRuntime@appConcurrentRequestLimit 设置的值. dudu的解决办法:htt ...

  5. UVAoj 11324 - The Largest Clique(tarjan + dp)

    题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<==>v 思路:首先将强连通分量通过tarjan算法求出 ...

  6. git分享(一)git clone

    git clone 命令参数: usage: git clone [options] [--] <repo> [<dir>] -v, --verbose be more ver ...

  7. vim 图解常用快捷键操作

    图片太大,可以将图片另存后看或者右键点击,选择查看图片.

  8. CentOS 7.2 MySQL 5.7 主从配置

    MySQL的安装:CentOS 7.2 yum方式安装MySQL 5.7 两台服务器分别如下: Master:192.168.1.100 Slave:192.168.1.101 Master配置: 编 ...

  9. 使用Codeblock搭建Windows下Objec-c学习环境

    学习Object-c如果使用的是Windows,一般推荐使用虚拟机,但是太重量级了,先要下载OS-X,又要下载x-code.这里推荐一种比较简便的方式,使用code-block来搭建简易的Object ...

  10. C中extern的用法

    /*********************************************************************** INPUT3.C -- Input data pars ...