获取选项列表中选项的值

时间:2012-11-09 14:26:22

标签: c# dynamics-crm-2011

我正在创建一个实体beep的虚假实例。它有一个picklist类型的必填字段,名为pickaboo。首先我省略了它,但随后由于某些业务逻辑要求所有新创建的beep实例分配该字段,应用程序开始向我发送错误消息。

Entity entity = new Entity { LogicalName = "beep" };
Guid guid = proxy.Create(entity);
proxy.Delete("beep", guid);

我没有给出一个啮齿动物的尾部关于这个需求,因为在我创建实例后,我正在删除它。然而,CRM给了一个巨大的啮齿动物,并没有让我做我的魔术。所以,我很聪明,并为缺少的属性添加了一个属性。

OptionSetValue option = new OptionSetValue(0);
Entity entity = new Entity { LogicalName = "beep" };
entity.Attributes.Add("pickaboo", option);
Guid guid = proxy.Create(entity);
proxy.Delete("beep", guid);

当然,它不起作用,因为零不是有效值。显然,CRM根据解决方案添加一个哈希值,因此实际的“零”具有数字值,如“846000000000”,实际“一”具有“846000000001”等。

如何以编程方式获取该值?

现在我有一个丑陋的解决方法,获取所有beep s 并从第一个获取值。甚至不要让我知道多少睡眠我不知道它看起来多么尴尬,是否有人花时间给我一些反馈。 :(

3 个答案:

答案 0 :(得分:3)

你有两个选择。

  1. 您可以使用CrmSrvcUtil生成您的OptionSetValues作为枚举...这将创建一个pickaboo枚举,然后您可以在您的代码中引用 entity.Attributes.Add("pickaboo", new OptionSetValue((int)pickaboo.YourEnumValue);

  2. 您还可以使用RetrieveOptionSetRequest消息获取您感兴趣的特定选项集的所有值的列表。请参阅this SO question

答案 1 :(得分:1)

由于我知道所有 CRM程序员都是懒猪(自己的经验,哈哈),我知道你更喜欢简短而全面的解决方案。我意识到您正在寻找快速访问只有一个有效值。如果我弄错了,请停止阅读 - 使用@Daryl的建议 - 他对你有一个很好的答案。

但是,如果我是对的,请使用此代码获取第一个有效选项值(前提是它存在)。为了以防万一,请记住用try/catch包围它,所以如果你拼错了,你最终不会挠头。

RetrieveAttributeRequest request = new RetrieveAttributeRequest
{
  EntityLogicalName = "beep",
  LogicalName = "pickaboo",
  RetrieveAsIfPublished = true
};
RetrieveAttributeResponse response 
  = proxy.Execute(request) as RetrieveAttributeResponse;
PicklistAttributeMetadata metaData 
  = response.AttributeMetadata as PicklistAttributeMetadata;
OptionSetValue option 
  = new OptionSetValue(metaData.OptionSet.Options[0].Value ?? -1);
  1. NB - 我假设您通过名为proxy的代理建立了有效连接。
  2. 在整个代码周围设置一个try/catch,以防万一发生超出限制的异常。
  3. 确保处理-1选项,因为返回的Value是一个可以为空的整数。

答案 2 :(得分:1)

这个问题激发了我的博客。

如果你看一下我的帖子,下面有一个函数可以用来查找选项列表(全局和本地选项集),状态代码,状态代码和布尔(两个选项)字段的int值。

CRM 2011 Programatically Finding the Values of Picklists, Optionsets, Statecode, Statuscode and Boolean (Two Options)