在 Dynamics 365 中使用可编辑网格

 

发布日期: 2017年1月

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

可编辑网格是 Microsoft Dynamics 365 中的一个新自定义控件,该控件在 Web 客户端和移动客户端(适用于手机的 Dynamics 365 和 适用于平板电脑的 Dynamics 365)中提供丰富的内联编辑功能,包括对同一个网格中的数据执行分组、排序和筛选,让您不必切换记录或视图。 Web 客户端上窗体中的主网格和子网格中,以及移动客户端上的仪表板和窗体网格中支持可编辑网格控件。 尽管可编辑网格控件提供编辑功能,但是它还是服从只读网格元数据和字段级安全设置。 可编辑网格还支持业务规则和窗体脚本,所以您可以根据组织的要求应用自定义业务逻辑。

备注

可编辑网格是在 适用于 Dynamics 365 的 2016 年 12 月更新(联机和本地) 中引入的。

本主题内容

启用可编辑网格

窗体脚本支持

可编辑网格支持的实体和视图

启用可编辑网格

您可以在实体级启用可编辑网格以在主网格中使用,或者在窗体级启用以将只读子网格(关联的网格)替换为可编辑网格。

您可以使用 Dynamics 365 中的自定义工具为实体启用可编辑网格控件(“设置”>“自定义”>“自定义系统”>“实体”“>” [Entity_Name]“>“控件”选项卡。

若要为窗体中的网格启用可编辑网格,请打开窗体编辑器,双击要替换为可编辑网格的只读网格,然后在“控件”选项卡中添加/启用可编辑网格。

如果需要,可以随时为主网格和关联的网格恢复到不可编辑网格。 用户也可以在运行时,在可编辑网格和只读网格之间切换。

详细信息:TechNet:在 Dynamics 365 中使用可编辑网格自定义控件将网格(列表)设置为可编辑

窗体脚本支持

可编辑网格支持可用于根据业务需求编写自定义客户端扩展的客户端事件和方法。详细信息:可编辑网格对象和方法(客户端引用)

可编辑网格支持的实体和视图

并非所有实体和视图都支持使用可编辑网格。

在 Web 客户端中,如果满足以下所有条件,实体将支持可编辑网格:

  • 此实体可自定义 (IsCustomizable = true)

  • 此实体已刷新 (IsAIRUpdated = true) 或为自定义实体 (IsCustomEntity = true)

  • 此实体不是子实体 (IsChildEntity = false)

在 Dynamics 365 移动客户端中,如果实体可在移动客户端的站点地图中显示,则该实体支持可编辑网格。

有关支持可编辑网格的实体的信息,请参阅 TechNet:在 Dynamics 365 中使用可编辑网格自定义控件将网格(列表)设置为可编辑中的支持的现成实体部分

可编辑网格不支持汇总关联的视图 Rollup type = Related)。

可使用以下示例代码生成一个 XML 文件,该文件可在 Microsoft Excel 中作为 XML 表打开来查看可编辑控件的实体支持信息。Excel 将自动理解架构,并在以下列下面显示信息:

  • LogicalName:实体的逻辑名称。

  • DisplayName:实体的显示名称。

  • CanEnableEditableGridWeb:有关 Web 客户端中的实体是否支持可编辑网格的显示状态(True 或 False)。

  • CanEnableEditableGridMobile:有关移动客户端中的实体是否支持可编辑网格的显示状态(True 或 False)。 (适用于手机的 Dynamics 365 和 适用于平板电脑的 Dynamics 365)。

using System;
using System.Linq;
using System.Xml.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Xml;
using System.IO;

// These namespaces are found in the Microsoft.Xrm.Sdk.dll assembly
// found in the SDK\bin folder.
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Messages;

// This namespace is found in Microsoft.Crm.Sdk.Proxy.dll assembly
// found in the SDK\bin folder.
using Microsoft.Crm.Sdk.Messages;

namespace Microsoft.Crm.Sdk.Samples
{
    /// <summary>
    /// This sample generates an XML table to display the entity-support information for 
    ///  editable controls.
    /// </summary>
    public class DumpEditableGridEntityInfo
    {
        #region Class Level Members

        /// <summary>
        /// Stores the organization service proxy.
        /// </summary>
        OrganizationServiceProxy _serviceProxy;

        // Create storage for new attributes being created
        public List<AttributeMetadata> addedAttributes;

        // Specify which language code to use in the sample. If you are using a language
        // other than US English, you will need to modify this value accordingly.
        // See https://msdn.microsoft.com/en-us/library/0h88fahh.aspx
        public const int _languageCode = 1033;

        // Define the IDs/variables needed for this sample.
        public int _insertedStatusValue;

        #endregion Class Level Members

        #region How To Sample Code
        /// <summary>
        /// </summary>
        /// <param name="serverConfig">Contains server connection information.</param>
        /// <param name="promptForDelete">When True, the user will be prompted to delete all
        /// created entities.</param>
        public void Run(ServerConnection.Configuration serverConfig, bool promptForDelete)
        {
            try
            {

                // Connect to the Organization service. 
                // The using statement assures that the service proxy will be properly disposed.
                using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri, serverConfig.Credentials, serverConfig.DeviceCredentials))
                {
                    // This statement is required to enable early-bound type support.
                    _serviceProxy.EnableProxyTypes();

                    //<snippetDumpEditableGridEntityInfo1>
                    RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest()
                    {
                        EntityFilters = EntityFilters.Entity,
                        RetrieveAsIfPublished = true
                    };

                    // Retrieve the MetaData.
                    RetrieveAllEntitiesResponse response = (RetrieveAllEntitiesResponse)_serviceProxy.Execute(request);


                    // Create an instance of StreamWriter to write text to a file.
                    // The using statement also closes the StreamWriter.
                    // To view this file, right click the file and choose open with Excel. 
                    // Excel will figure out the schema and display the information in columns.

                    String filename = String.Concat("EditableGridEntityInfo.xml");
                    using (StreamWriter sw = new StreamWriter(filename))
                    {
                        // Create Xml Writer.
                        XmlTextWriter metadataWriter = new XmlTextWriter(sw);

                        // Start Xml File.
                        metadataWriter.WriteStartDocument();

                        // Metadata Xml Node.
                        metadataWriter.WriteStartElement("Metadata");

                        foreach (EntityMetadata currentEntity in response.EntityMetadata)
                        {
                            // Start Entity Node
                            metadataWriter.WriteStartElement("Entity");

                            bool canBeDisplayedInSitemap = currentEntity.IsCustomizable.Value;

                            if (canBeDisplayedInSitemap)
                            {
                                metadataWriter.WriteElementString("LogicalName", currentEntity.LogicalName);
                                metadataWriter.WriteElementString("DisplayName", currentEntity.DisplayName.UserLocalizedLabel?.Label);
                                metadataWriter.WriteElementString("CanEnableEditableGridWeb", (!(bool)currentEntity.IsChildEntity && ((bool)currentEntity.IsAIRUpdated || (bool)currentEntity.IsCustomEntity)).ToString());
                                metadataWriter.WriteElementString("CanEnableEditableGridMobile", (currentEntity.IsVisibleInMobileClient.Value || currentEntity.IsVisibleInMobileClient.CanBeChanged).ToString());
                            }

                            // Write the Entity's Information.

                            //End Entity Node
                            metadataWriter.WriteEndElement();
                        }

                        // End Metadata Xml Node
                        metadataWriter.WriteEndElement();
                        metadataWriter.WriteEndDocument();

                        // Close xml writer.
                        metadataWriter.Close();
                        Console.WriteLine("Dumped information in the EditableGridEntityInfo.xml file");
                    }
                }
            }

            // Catch any service fault exceptions that Microsoft Dynamics CRM throws.
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
        }
        #endregion How To Sample Code

        #region Main
        /// <summary>
        /// Standard Main() method used by most SDK samples.
        /// </summary>
        /// <param name="args"></param>
        static public void Main(string[] args)
        {
            try
            {
                // Obtain the target organization's Web address and client logon 
                // credentials from the user.
                ServerConnection serverConnect = new ServerConnection();
                ServerConnection.Configuration config = serverConnect.GetServerConfiguration();
                DumpEditableGridEntityInfo app = new DumpEditableGridEntityInfo();
                app.Run(config, false);                
            }
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine("Timestamp: {0}", ex.Detail.Timestamp);
                Console.WriteLine("Code: {0}", ex.Detail.ErrorCode);
                Console.WriteLine("Message: {0}", ex.Detail.Message);
                Console.WriteLine("Plugin Trace: {0}", ex.Detail.TraceText);
                Console.WriteLine("Inner Fault: {0}",
                    null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
            }
            catch (System.TimeoutException ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine("Message: {0}", ex.Message);
                Console.WriteLine("Stack Trace: {0}", ex.StackTrace);
                Console.WriteLine("Inner Fault: {0}",
                    null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine(ex.Message);

                // Display the details of the inner exception.
                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);

                    FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> fe
                        = ex.InnerException
                        as FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>;
                    if (fe != null)
                    {
                        Console.WriteLine("Timestamp: {0}", fe.Detail.Timestamp);
                        Console.WriteLine("Code: {0}", fe.Detail.ErrorCode);
                        Console.WriteLine("Message: {0}", fe.Detail.Message);
                        Console.WriteLine("Plugin Trace: {0}", fe.Detail.TraceText);
                        Console.WriteLine("Inner Fault: {0}",
                            null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
                    }
                }
            }
            // Additional exceptions to catch: SecurityTokenValidationException, ExpiredSecurityTokenException,
            // SecurityAccessDeniedException, MessageSecurityException, and SecurityNegotiationException.

            finally
            {

                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }

        }
        #endregion Main

    }
}

另请参阅

可编辑网格对象和方法(客户端引用)
TechNet:在 Dynamics 365 中使用可编辑网格自定义控件将网格(列表)设置为可编辑

Microsoft Dynamics 365

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