配置全局选项集

 

发布日期: 2017年1月

适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online

通常,使用全局选项集来设置字段,以便不同的字段可以共享同一组选项,并且在一个位置对选项进行维护。 您可以重新使用全局选项集。 您还会看到在请求参数中使用它们,其使用方式与枚举类似。

使用 OptionMetadata 定义选项值时,建议您让系统赋值。 方法是在创建新的 OptionMetadata 实例时传递 null 值。 当您定义选项时,其中包含一个特定于为在其中创建该选项集的解决方案设置的发布程序的上下文的选项值前缀。 此前缀有助于减少为托管解决方案创建重复选项集的几率,并且在安装托管解决方案的组织中定义的任何选项集内创建重复选项集的几率。 有关详细信息,请参阅合并选项集选项

本主题内容

检索全局选项集

创建全局选项集

创建使用全局选项集的选择列表

更新全局选项集

检索所有全局选项集

删除全局选项集

检索全局选项集

以下示例演示如何使用 RetrieveOptionSetRequest 消息按名称检索全局选项集:


// Use the RetrieveOptionSetRequest message to retrieve  
// a global option set by it's name.
RetrieveOptionSetRequest retrieveOptionSetRequest =
    new RetrieveOptionSetRequest
    {
        Name = _globalOptionSetName
    };

// Execute the request.
RetrieveOptionSetResponse retrieveOptionSetResponse =
    (RetrieveOptionSetResponse)_serviceProxy.Execute(
    retrieveOptionSetRequest);

Console.WriteLine("Retrieved {0}.",
    retrieveOptionSetRequest.Name);

// Access the retrieved OptionSetMetadata.
OptionSetMetadata retrievedOptionSetMetadata =
    (OptionSetMetadata)retrieveOptionSetResponse.OptionSetMetadata;

// Get the current options list for the retrieved attribute.
OptionMetadata[] optionList =
    retrievedOptionSetMetadata.Options.ToArray();

' Use the RetrieveOptionSetRequest message to retrieve  
' a global option set by it's name.
Dim retrieveOptionSetRequest As RetrieveOptionSetRequest = New RetrieveOptionSetRequest With {
 .Name = _globalOptionSetName
}

' Execute the request.
Dim retrieveOptionSetResponse As RetrieveOptionSetResponse =
 CType(_serviceProxy.Execute(retrieveOptionSetRequest), RetrieveOptionSetResponse)

Console.WriteLine("Retrieved {0}.", retrieveOptionSetRequest.Name)

' Access the retrieved OptionSetMetadata.
Dim retrievedOptionSetMetadata As OptionSetMetadata =
 CType(retrieveOptionSetResponse.OptionSetMetadata, OptionSetMetadata)

' Get the current options list for the retrieved attribute.
Dim optionList() As OptionMetadata = retrievedOptionSetMetadata.Options.ToArray()

创建全局选项集

使用 CreateOptionSetRequest 消息创建新的全局选项集。 将 IsGlobal 属性设置为 true 来指示选项集是全局的。 下面的代码示例创建一个名为“Example Option Set”的全局选项集:


#region How to create global option set
// Define the request object and pass to the service.
CreateOptionSetRequest createOptionSetRequest = new CreateOptionSetRequest
{
    // Create a global option set (OptionSetMetadata).
    OptionSet = new OptionSetMetadata
    {
        Name = _globalOptionSetName,
        DisplayName = new Label("Example Option Set", _languageCode),
        IsGlobal = true,
        OptionSetType = OptionSetType.Picklist,
        Options = 
    {
        new OptionMetadata(new Label("Open", _languageCode), null),
        new OptionMetadata(new Label("Suspended", _languageCode), null),
        new OptionMetadata(new Label("Cancelled", _languageCode), null),
        new OptionMetadata(new Label("Closed", _languageCode), null)
    }
    }
};

// Execute the request.
CreateOptionSetResponse optionsResp =
    (CreateOptionSetResponse)_serviceProxy.Execute(createOptionSetRequest);

'                    #Region "How to create global option set"
' Define the request object and pass to the service.
Dim createOptionSetRequest As CreateOptionSetRequest = New CreateOptionSetRequest()
Dim createOptionSetOptionSet As OptionSetMetadata = New OptionSetMetadata() With {
 .Name = _globalOptionSetName,
 .DisplayName = New Label("Example Option Set", _languageCode),
 .IsGlobal = True,
 .OptionSetType = OptionSetType.Picklist
}
createOptionSetOptionSet.Options.AddRange(
 {
  New OptionMetadata(New Label("Open", _languageCode), Nothing),
  New OptionMetadata(New Label("Suspended", _languageCode), Nothing),
  New OptionMetadata(New Label("Cancelled", _languageCode), Nothing),
  New OptionMetadata(New Label("Closed", _languageCode), Nothing)
 }
)

createOptionSetRequest.OptionSet = createOptionSetOptionSet
' Create a global option set (OptionSetMetadata).

' Execute the request.
Dim optionsResp As CreateOptionSetResponse =
 CType(_serviceProxy.Execute(createOptionSetRequest), CreateOptionSetResponse)

创建使用全局选项集的选择列表

以下示例演示如何使用 CreateAttributeRequest 创建使用全局选项集的选择列表属性:


// Create a Picklist linked to the option set.
// Specify which entity will own the picklist, and create it.
CreateAttributeRequest createRequest = new CreateAttributeRequest
{
    EntityName = Contact.EntityLogicalName,
    Attribute = new PicklistAttributeMetadata
    {
        SchemaName = "sample_examplepicklist",
        LogicalName = "sample_examplepicklist",
        DisplayName = new Label("Example Picklist", _languageCode),
        RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),

        // In order to relate the picklist to the global option set, be sure
        // to specify the two attributes below appropriately.
        // Failing to do so will lead to errors.
        OptionSet = new OptionSetMetadata
        {
            IsGlobal = true,
            Name = _globalOptionSetName
        }
    }
};

_serviceProxy.Execute(createRequest);

' Create a Picklist linked to the option set.
' Specify which entity will own the picklist, and create it.
Dim createRequest As CreateAttributeRequest = New CreateAttributeRequest With {
 .EntityName = Contact.EntityLogicalName,
 .Attribute = New PicklistAttributeMetadata With {
  .SchemaName = "sample_examplepicklist", .LogicalName = "sample_examplepicklist",
  .DisplayName = New Label("Example Picklist", _languageCode),
  .RequiredLevel = New AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
  .OptionSet = New OptionSetMetadata With {
   .IsGlobal = True,
   .Name = _globalOptionSetName
  }
 }
}
' In order to relate the picklist to the global option set, be sure
' to specify the two attributes below appropriately.
' Failing to do so will lead to errors.

_serviceProxy.Execute(createRequest)

更新全局选项集

以下示例演示如何使用 UpdateOptionSetRequest 消息更新全局选项集的标签:


// Use UpdateOptionSetRequest to update the basic information of an option
// set. Updating option set values requires different messages (see below).
UpdateOptionSetRequest updateOptionSetRequest = new UpdateOptionSetRequest
{
    OptionSet = new OptionSetMetadata
    {
        DisplayName = new Label("Updated Option Set", _languageCode),
        Name = _globalOptionSetName,
        IsGlobal = true
    }
};

_serviceProxy.Execute(updateOptionSetRequest);

//Publish the OptionSet
PublishXmlRequest pxReq1 = new PublishXmlRequest { ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>", _globalOptionSetName) };
_serviceProxy.Execute(pxReq1);

' Use UpdateOptionSetRequest to update the basic information of an option
' set. Updating option set values requires different messages (see below).
Dim updateOptionSetRequest As UpdateOptionSetRequest = New UpdateOptionSetRequest With {
 .OptionSet = New OptionSetMetadata With {
  .DisplayName = New Label("Updated Option Set", _languageCode),
  .Name = _globalOptionSetName,
  .IsGlobal = True
 }
}

_serviceProxy.Execute(updateOptionSetRequest)

'Publish the OptionSet
Dim pxReq1 As PublishXmlRequest = New PublishXmlRequest With {
 .ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>", _globalOptionSetName)
}
_serviceProxy.Execute(pxReq1)

对选项进行排序

以下示例演示如何使用 OrderOptionRequest 排序全局选项集中的选项:


// Change the order of the original option's list.
// Use the OrderBy (OrderByDescending) linq function to sort options in  
// ascending (descending) order according to label text.
// For ascending order use this:
var updateOptionList =
    optionList.OrderBy(x => x.Label.LocalizedLabels[0].Label).ToList();

// For descending order use this:
// var updateOptionList =
//      optionList.OrderByDescending(
//      x => x.Label.LocalizedLabels[0].Label).ToList();

// Create the request.
OrderOptionRequest orderOptionRequest = new OrderOptionRequest
{
    // Set the properties for the request.
    OptionSetName = _globalOptionSetName,
    // Set the changed order using Select linq function 
    // to get only values in an array from the changed option list.
    Values = updateOptionList.Select(x => x.Value.Value).ToArray()
};

// Execute the request
_serviceProxy.Execute(orderOptionRequest);

//Publish the OptionSet
PublishXmlRequest pxReq4 = new PublishXmlRequest { ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>", _globalOptionSetName) };
_serviceProxy.Execute(pxReq4);

' Change the order of the original option's list.
' Use the OrderBy (OrderByDescending) linq function to sort options in  
' ascending (descending) order according to label text.
' For ascending order use this:
Dim updateOptionList = optionList.OrderBy(Function(x) x.Label.LocalizedLabels(0).Label).ToList()

' For descending order use this:
' var updateOptionList =
'      optionList.OrderByDescending(
'      x => x.Label.LocalizedLabels[0].Label).ToList();

' Create the request.
Dim orderOptionRequest As OrderOptionRequest =
 New OrderOptionRequest With {
  .OptionSetName = _globalOptionSetName,
  .Values = updateOptionList.Select(Function(x) x.Value.Value).ToArray()
 }
' Set the properties for the request.
' Set the changed order using Select linq function 
' to get only values in an array from the changed option list.

' Execute the request
_serviceProxy.Execute(orderOptionRequest)

'Publish the OptionSet
Dim pxReq4 As PublishXmlRequest =
 New PublishXmlRequest With {
  .ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>",
                                _globalOptionSetName)
 }
_serviceProxy.Execute(pxReq4)

检索所有全局选项集

以下示例演示如何使用 RetrieveAllOptionSetsRequest 检索所有全局选项集:


// Use RetrieveAllOptionSetsRequest to retrieve all global option sets.
// Create the request.
RetrieveAllOptionSetsRequest retrieveAllOptionSetsRequest =
    new RetrieveAllOptionSetsRequest();

// Execute the request
RetrieveAllOptionSetsResponse retrieveAllOptionSetsResponse =
    (RetrieveAllOptionSetsResponse)_serviceProxy.Execute(
    retrieveAllOptionSetsRequest);

// Now you can use RetrieveAllOptionSetsResponse.OptionSetMetadata property to 
// work with all retrieved option sets.
if (retrieveAllOptionSetsResponse.OptionSetMetadata.Count() > 0)
{
    Console.WriteLine("All the global option sets retrieved as below:");
    int count = 1;
    foreach (OptionSetMetadataBase optionSetMetadata in
        retrieveAllOptionSetsResponse.OptionSetMetadata)
    {
        Console.WriteLine("{0} {1}", count++,
            (optionSetMetadata.DisplayName.LocalizedLabels.Count >0)? optionSetMetadata.DisplayName.LocalizedLabels[0].Label : String.Empty);
    }
}

' Use RetrieveAllOptionSetsRequest to retrieve all global option sets.
' Create the request.
Dim retrieveAllOptionSetsRequest As New RetrieveAllOptionSetsRequest()

' Execute the request
Dim retrieveAllOptionSetsResponse As RetrieveAllOptionSetsResponse =
 CType(_serviceProxy.Execute(retrieveAllOptionSetsRequest), RetrieveAllOptionSetsResponse)

' Now you can use RetrieveAllOptionSetsResponse.OptionSetMetadata property to 
' work with all retrieved option sets.
If retrieveAllOptionSetsResponse.OptionSetMetadata.Count() > 0 Then
 Console.WriteLine("All the global option sets retrieved as below:")
 Dim count As Integer = 1
 For Each optionSetMetadata As OptionSetMetadataBase In retrieveAllOptionSetsResponse.OptionSetMetadata
                       Console.WriteLine("{0} {1}",
                                         count,
                                         If(optionSetMetadata.DisplayName.LocalizedLabels.Count > 0,
                                            optionSetMetadata.DisplayName.LocalizedLabels(0).Label,
                                            String.Empty))
  count += 1
 Next optionSetMetadata
End If

删除全局选项集

以下示例演示如何使用 RetrieveDependentComponentsRequest 检查全局选项集是否正在由其他解决方案组件使用,然后演示如何使用 DeleteOptionSetRequest 删除它:


// Create the request to see which components have a dependency on the
// global option set.
RetrieveDependentComponentsRequest dependencyRequest =
    new RetrieveDependentComponentsRequest
    {
        ObjectId = _optionSetId,
        ComponentType = (int)componenttype.OptionSet
    };

RetrieveDependentComponentsResponse dependencyResponse =
    (RetrieveDependentComponentsResponse)_serviceProxy.Execute(
    dependencyRequest);

// Here you would check the dependencyResponse.EntityCollection property
// and act as appropriate. However, we know there is exactly one 
// dependency so this example deals with it directly and deletes 
// the previously created attribute.
DeleteAttributeRequest deleteAttributeRequest =
    new DeleteAttributeRequest
{
    EntityLogicalName = Contact.EntityLogicalName,
    LogicalName = "sample_examplepicklist"
};

_serviceProxy.Execute(deleteAttributeRequest);

Console.WriteLine("Referring attribute deleted.");
#endregion How to delete attribute

#region How to delete global option set

// Finally, delete the global option set. Attempting this before deleting
// the picklist above will result in an exception being thrown.
DeleteOptionSetRequest deleteRequest = new DeleteOptionSetRequest
{
    Name = _globalOptionSetName
};

_serviceProxy.Execute(deleteRequest);

' Create the request to see which components have a dependency on the
' global option set.
Dim dependencyRequest As RetrieveDependentComponentsRequest =
 New RetrieveDependentComponentsRequest With {
  .ObjectId = _optionSetId,
  .ComponentType = componenttype.OptionSet
 }

Dim dependencyResponse As RetrieveDependentComponentsResponse =
 CType(_serviceProxy.Execute(dependencyRequest), RetrieveDependentComponentsResponse)

' Here you would check the dependencyResponse.EntityCollection property
' and act as appropriate. However, we know there is exactly one 
' dependency so this example deals with it directly and deletes 
' the previously created attribute.
Dim deleteAttributeRequest As DeleteAttributeRequest =
 New DeleteAttributeRequest With {
  .EntityLogicalName = Contact.EntityLogicalName,
  .LogicalName = "sample_examplepicklist"
 }

_serviceProxy.Execute(deleteAttributeRequest)

Console.WriteLine("Referring attribute deleted.")
'#End Region ' How to delete attribute

'#Region "How to delete global option set"

' Finally, delete the global option set. Attempting this before deleting
' the picklist above will result in an exception being thrown.
Dim deleteRequest As DeleteOptionSetRequest =
 New DeleteOptionSetRequest With {
  .Name = _globalOptionSetName
 }

_serviceProxy.Execute(deleteRequest)

另请参阅

自定义 Microsoft Dynamics 365 应用程序
使用含有 Dynamics 365 元数据的组织服务
插入、更新、删除和排序全局选项集选项
全局选项集消息
全局选项元数据值
示例:创建全局选项集
示例:使用全局选项集
示例:将全局选项集信息转储到文件

Microsoft Dynamics 365

© 2017 Microsoft。 保留所有权利。 版权