MS CRM 2011 如何获得Option Set的Label与Value

CRM中有一种Field的类型是Option Set。每一个option都是由一对 label + ">value组成的。比如我下面图中的Option Set,它的第一个option的Label是Logistic – Incorrect item,而它的value为267060000。

那么CRM SDK为我们提供了哪写方法可以获得一个Option Set 的Label和Value值呢?我在案例(incident)中创建了一个custom field aw_complaintcause,它是Option Set类型,而它所使用的Option Set即为上面图中创造的Case Option Set。

下面我分别演示一下在CRM的前端与后端如何获得Option Set 的Label 与 Value。

(一)前端

如果是使用JScript获得某个Option Set field的Label 或者 Value,比如在Form的OnLoad事件处理器中,可以用

获得 Label:

Xrm.Page.getAttribute(fieldname).getText();

获得 Value:

Xrm.Page.getAttribute(fieldname).getValue();

如果Option Set为Unassigned Value,上面方法获得Label为空字符””,Value值为null。

我们也可以遍历一个Option Set 的所有options:

var objControl = Xrm.Page.getControl(fieldname); var objOptions = objControl.getAttribute().getOptions(); for (var i = 0; i < objOptions.length; i++) {
alert(objOptions[i].text); alert(objOptions[i].value); }

(二) 后端

运行在服务器上的代码(C#或者VB)该如何获得某个Option Set的Label或Value呢?

以插件(plugin)中的代码为例,获得Value很简单,可以使用

int optionValue = ((OptionSetValue)entity[fieldname]).Value;

代码的片断如下所示:

if (context.MessageName == "Update") { Entity entity = (Entity)context.InputParameters["Target"]; if (entity.Contains(fieldname) && entity[fieldname] != null) { int optionValue = ((OptionSetValue)entity[fieldname]).Value; } }

如果Option Set为Unassigned Value,则entity[fieldname] 为 null。

要获得Label就不象用JScript那样简单了,我们首先要知道当前option的value值,然后发送一个RetrieveAttributeRequest,在RetrieveAttributeResponse中获得AttributeMetadata,然后遍历Option Set的每一个option,当某个option的Value值与我们的value相等时,返回该option的Label。可以使用下面的代码来获得Label

private string GetOptionLabel(IOrganizationService service, ITracingService tracingService, string entityname, string attributename, int value) { RetrieveAttributeRequest retrieveAttributeRequest = new RetrieveAttributeRequest { EntityLogicalName = entityname, LogicalName = attributename }; // Execute the request. RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest); tracingService.Trace("Debug: Entity {0} Attribute {1} is retrieved", entityname, attributename); OptionMetadata
Collection options = ((PicklistAttributeMetadata)retrieveAttributeResponse.AttributeMetadata).OptionSet.Options; OptionMetadata option = options.Where(x => x.Value == value).FirstOrDefault(); tracingService.Trace("Debug: Option of value {0} is retrieved", value); if (option != null) { tracingService.Trace("Debug: option != null"); return option.Label.UserLocalizedLabel.Label; } else { return ""; } }

上面的代码返回的是option.Label.UserLocalizedLabel.Label,也就是用户当前使用语言的Label(我在前面的博客中介绍过如何获得当前用户使用的界面语言),如果你想获得其他语言的Label,也可以使用下面的方法:

private string GetOptionLabel(IOrganizationService service, ITracingService tracingService, string entityname, string attributename, int value, int languagecode) { RetrieveAttributeRequest retrieveAttributeRequest = new RetrieveAttributeRequest { EntityLogicalName = entityname, LogicalName = attributename }; // Execute the request. RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest); tracingService.Trace("Debug: Entity {0} Attribute {1} is retrieved", entityname, attributename); OptionMetadataCollection options = ((PicklistAttributeMetadata)retrieveAttributeResponse.AttributeMetadata).OptionSet.Options; OptionMetadata option = options.Where(x => x.Value == value).FirstOrDefault(); tracingService.Trace("Debug: Option of value {0} is retrieved", value); if (option != null) { tracingService.Trace("Debug: option != null"); var label = option.Label.LocalizedLabels.Where(x => x.
LanguageCode == languagecode).FirstOrDefault(); tracingService.Trace("Debug: Label of language {0} is retrieved", languagecode); if (label != null) { tracingService.Trace("Debug: label != null"); return label.Label; } } return ""; }

这种方法需要对option.Label.LocalizedLabels进行遍历,获得某种语言的Label。

总结:在前端利用JScript获得某Option Set field的Label或Value很简单,只需要分别使用Xrm.Page.getAttribute(fieldname).getText()和Xrm.Page.getAttribute(fieldname).getValue()。在后端获得Value很容易,因为value值已经包含在OptionSetValue中了,但要获得Label,需要先获得该field的AttributeMetadata,然后对每个option遍历,找到value值相同的option,再返回该option的label。

时间: 2024-11-03 21:50:23

MS CRM 2011 如何获得Option Set的Label与Value的相关文章

MS CRM 2011 在CRM中使用REST Endpoint

CRM提供了两种http://www.aliyun.com/zixun/aggregation/14280.html">WCF Web Service,一个是Organization Service,使用的是SOAP协议,另一个是Organization Data Service,使用的是OData(REST)协议.我们在为CRM写插件(plugin)的时候,通常都要用到第一种web service,而在客户端进行编程的时候就要使用到Organization Data Service了.O

MS CRM 2011 用Jscript打开新窗口的几种方法

在CRM中,我们经常遇到这样的情况,点击一个按钮,需要弹出一个新的窗口.比如在客户中添加新联系人: 在MS CRM2011中,有以下几种方法可以打开一个新的窗口: (1) Xrm.Utility.openEntityForm (2) window.open (3) openObj 前两种是在SDK中支持的,尤其推荐使用第一种,但要注意Xrm.Utility这个对象只在Rollup 8以后的版本才支持.这里顺便列出来CRM 2011各个Rollup的版本号: Build VersionRTM: 5

MS CRM 2011 如何获得当前用户使用的界面语言

我在之前的博客中介绍过如何为Microsoft Dynamics CRM 2011 安装语言包,安装了不同的语言包后,用户可以选择使用不同的界面语言.我在本文中介绍一下如何获得当前用户使用的界面语言. (一) 前端 如果是使用JScript获得当前用户使用的界面语言,比如在Form的OnLoad事件处理器中,可以用 context.getUserLcid() 该方法返回一个数字,即为Language ID,比如美国英语是1033,中文简体为2052.完整的Locale ID Values表,大家

MS CRM 2011 插件(plugin)的快速开发 -- 创建模板

如果你开发过很多MS CRM的插件的话,相信你一定会发现,如果每一次开发插件都从头做起的话,你会做很多重复性的工作.如果你发现你每天做着重复性的工作,你就要考虑怎样才能将重复降到最低,理想的情况就是只做一次. 开发CRM的插件(当然要使用Visual Studio)你需要做很多"准备性的工作",比如添加引用,给插件签名.这些"准备性的工作"也就是重复性的工作,非常浪费时间.一个好的解决办法,就是创建一个你自己的插件模板.在这篇文章中,我为大家介绍两个方面的经验:一是

如何使用 MS CRM 2011 中的目标(Goal) -- 第一节

Goal是CRM 2011中的一个新特性.任何新特性都有一个共同点,就是需要学习曲线.下面就让我们看一下,在CRM 2011中如何使用和管理Goal. 我们先通过一个简单的例子来对Goal有一个初步的认识.我们打开一个CRM范例数据中的一个goal记录," Q3 目標 (範例)". &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 打开Q3的表单后,可以看到几个重要的数据,Goal Metric

MS CRM 2011 Plugin Unsecure Configuration

在注册CRM插件(plugin)的时候,可以配置unsecure configuration和secure configuration.本文中着重讲解一下Unsecure Configuration的使用. 既然是unsecure的,那么在这里配置的信息,可以被任何人看见并使用.那么如何在plugin中获得unsecure configuration中的字符串呢?我们需要为plugin定义一个构造函数public Plugin(string unsecureConfig) 或者如果你也想使用se

MS CRM 2011 剖析Form与Dialog的URL

Microsoft http://www.aliyun.com/zixun/aggregation/4979.html">Dynamics CRM本质上只是一个ASP.Net程序,当然它是一个很厉害的,高手们开发出来的程序.基本上每一个窗口或者对话框都有固定的URL,这些窗口或对话框的特性也是由URL中的query string来决定.也就是说,如果你知道了某个窗口或对话框的URL是什么,你就可以在扩展CRM时,用JScript来打开这个窗口或对话框了. 下面举一个简单的例子来看如何获得一

MS CRM 2011 实例 -- 添加Connect子选项

项目要求在account和contact上的Connect按钮上添加新的选项,Responsible Partner. 首先创建一个新的solution,包含以下的组成部分: 在Connection中设置表单字定义参数:Form Properties –> Parameters 也可以在XML中定义参数,具体可以参见这一篇文章,或者SDk "Configure a Form to Accept Custom Querystring Parameters".在Form中设置OnLo

MS CRM 2011 创建基于Fetch的报表 -- 进阶版

在之前的文章中,我介绍了如何创建基于Fetch的报表,并使用数据预筛选功能.在这篇文章中,我们使用一个比较复杂的FetchXML来完成一个更有实际意义的报表. 在这个报表中,显示相关客户,客户的订单,以及订单的产品信息.报表使用了三个inner join,account inner join order inner join orderdetail inner join product. (1) 利用CRM的高级查找创建FetchXML 下载Fetch XML: <fetch version=&qu