由于从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. oracle 日期获取

    ,'YYYY-MM-DD')星期一, to_char(NEXT_DAy(to_date(,'YYYY-MM-DD')星期日 from dual; select to_char(sysdate,'yyy ...

  2. ubuntu remove mysql

    ubuntu 彻底删除 mysql 然后重装 mysql 删除 mysql sudo apt-get autoremove --purge mysql-server-5.0sudo apt-get r ...

  3. C#中,接口不能被实例化,但存在特例

    看一个例子: interface IFoo { string Message { get; } } 则, IFoo obj = new IFoo("abd"); 将会报错:接口不能 ...

  4. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...

  5. ruby -- 基础学习(一)项目文件夹说明

    App文件夹子文件夾功能介绍 (1)controllers  存放驱动业务逻辑的控制器 (2)helpers       存放视图辅助类,一些常用的代码段 (3)mailers       Rails ...

  6. react native之组织组件

    这些组件包括<TabView>,<NavigatorView>和<ListView>,他们实现了手机端最常用的交互和导航.你会发现这些组件在实际的项目中会非常有用. ...

  7. RPM安装命令总结--转载

    原地址:http://www.cnblogs.com/zqwang0929/p/3352237.html 在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的 ...

  8. gulp-uglify《JS压缩》----gulp系列(四)

    本节实现JS压缩,在实现压缩前,先配置JS任务,设置源目录和输出目录. 在系列(三)代码的基础上,再进行扩展. 1.找到gulp->config.js,对JS进行源目录(src->img) ...

  9. gulp-imagemin图片压缩----gulp系列(三)

    本节实现图片压缩,在实现压缩前,先配置images任务,设置源目录和输出目录. 在系列(二)代码的基础上,再进行扩展. 1.找到gulp->config.js,对images进行源目录(src- ...

  10. 免费下载!Twitter Bootstrap V3 矢量界面素材

    Bootstrap 3 Vector UI Kit 包含所有矢量格式的 Twitter Bootstrap 3 界面控制元素.Glyphicons 以及额外的一些界面素材,而且基本的图形元素都切好图了 ...