关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复166或者20151028可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!
前面的博文:Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮Dynamics CRM 客户端程序开发:自定义系统标准按钮的可用性 ,都是使用的工具Ribbon Workbench。其实SDK中介绍的方法是直接更改文件 customization.xml 的方法,算是比较原始的方法,利用工具来定制的话其实也是更改这个文件,使用Ribbon Workbench 有一个很让人吐槽的弊端就是发布较慢耗时较长,容易导致CRM出现 SQL Server Error. SQL Server timeout expired 错误。我看也要掌握比较原始的方法比较靠谱,这篇文章就是带你玩转命令栏的基本定制。
我们知道在Dynamics CRM 2011时候还没有命令栏(command bar)一说,使用的是Ribbon功能区,自从Dynamics CRM 2013以后才逐渐的由命令栏占据了主流。虽然这样,但是他们使用的xml是一样的,只是显示形式不一样,按照官方的说法,命令栏显示更为高效。因为这个xml文件最初是为Ribbon功能区设计的,所以还是称之为Ribbon定义文件。
首先要明白的是你的所有修改都要放在 customization.xml 这个文件中 RibbonDiffXml 这个元素下面的 CustomAction 元素或者 HideCustomAction 元素中。要定制Ribbon,需要对现有Ribbon的定义有所了解,比较直接的方法是导出来看看,这是这篇博文带领大家做的第一件事情。当然啦,也可以直接查看未经客制化的accountRibbon.xml定义文件,这些文件在 SDK\Resources\ExportedRibbonXml 文件夹中,比如客户实体的命令栏定义文件是 accountRibbon.xml 。说到这些Ribbon定义文件,有一个重要的Ribbon定义文件,大家可能猜到了,那就是一个作为模板的Ribbon定义文件:applicationRibbon.xml 。导出Ribbon定义文件主要涉及到两个消息,其中的一个 RetrieveApplicationRibbonRequest 便是导出这个模板 applicationRibbon.xml 文件的。我使用如下的代码来导出它,导出来行数还挺多,7812行。
  1. static void Main(string[] args)
  2. {
  3. var service = GetOrganizationService();
  4. RetrieveApplicationRibbonRequest appribReq = new RetrieveApplicationRibbonRequest();
  5. RetrieveApplicationRibbonResponse appribResp = (RetrieveApplicationRibbonResponse)service.Execute(appribReq);
  6. File.WriteAllBytes(@"D:\luoyong\applicationRibbon.xml", unzipRibbon(appribResp.CompressedApplicationRibbonXml));
  7. Console.WriteLine("程序运行完成!");
  8. Console.ReadKey();
  9. }
  10.  
  11. /// <summary>
  12. /// A helper method that decompresses the the Ribbon data returned
  13. /// </summary>
  14. /// <param name="data">The compressed ribbon data</param>
  15. /// <returns></returns>
  16. static byte[] unzipRibbon(byte[] data)
  17. {
  18. System.IO.Packaging.ZipPackage package = null;
  19. MemoryStream memStream = null;
  20.  
  21. memStream = new MemoryStream();
  22. memStream.Write(data, , data.Length);
  23. package = (ZipPackage)ZipPackage.Open(memStream, FileMode.Open);
  24.  
  25. ZipPackagePart part = (ZipPackagePart)package.GetPart(new Uri("/RibbonXml.xml", UriKind.Relative));
  26. using (Stream strm = part.GetStream())
  27. {
  28. long len = strm.Length;
  29. byte[] buff = new byte[len];
  30. strm.Read(buff, , (int)len);
  31. return buff;
  32. }
  33. }

我使用如下的代码导出某个实体的Ribbon定义文件,我这里导出逻辑名称为 new_test 的Ribbon定义,导出来行数还挺多,5027行。

  1. static void Main(string[] args)
  2. {
  3. var service = GetOrganizationService();
  4. const string entityName = "new_test";
  5. RetrieveEntityRibbonRequest entRibReq = new RetrieveEntityRibbonRequest() { RibbonLocationFilter = RibbonLocationFilters.All };
  6. entRibReq.EntityName = entityName;
  7. RetrieveEntityRibbonResponse entRibResp = (RetrieveEntityRibbonResponse)service.Execute(entRibReq);
  8. System.String entityRibbonPath = Path.GetFullPath(@"D:\luoyong\" + entityName + "Ribbon.xml");
  9. File.WriteAllBytes(entityRibbonPath, unzipRibbon(entRibResp.CompressedEntityXml));
  10. Console.WriteLine("程序运行完成!");
  11. Console.ReadKey();
  12. }

按钮我们主要是能在三个地方用到看到,第一个就是实体的列表界面的命令栏,第二个打开显示一条记录的表单界面,第三个就是子网格也会有个命令栏。下面列举了会应用到每个实体命令栏的Tab:

Tab命名形式 显示区域 备注
Mscrm.Form.{!实体逻辑名称}.MainTab 实体表单界面 以Mscrm.Form.开头
Mscrm.Form.{!实体逻辑名称}.Related
Mscrm.Form.{!实体逻辑名称}.Developer
Mscrm.HomepageGrid.{!实体逻辑名称}.MainTab 实体列表界面 以Mscrm.HomepageGrid开头
Mscrm.HomepageGrid.{!实体逻辑名称}.View
Mscrm.HomepageGrid.{!实体逻辑名称}.Related
Mscrm.HomepageGrid.{!实体逻辑名称}.Developer
Mscrm.SubGrid.{!实体逻辑名称}.ContextualTabs 子网格界面 以Mscrm.SubGrid 开头。但是Dynamics CRM 2013版本以后只有三个按钮,一个新增,一个列表,一个删除。你不能增加显示更多按钮,但是可以隐藏一些按钮。也可以定制点击这些按钮的时候执行的操作。
Mscrm.SubGrid.{!实体逻辑名称}.MainTab
 
你可能会问后面这些MainTab,Related,Developer,View 等等分别代表什么含义,我截个Dynamics CRM 2011的图你就知道了,以前的Ribbon功能区是分很多Tab的。Dynamics CRM 2013以后的版本不分了。
下面我们来尝试来增加一个命令栏按钮看看。首先需要一个解决方案,我这里已经新建好了一个名称为 RibbonSolution的解决方案,然后进添加你要修改的实体(添加现有 > 实体),当弹出窗口缺少必须组件的时候,我们选择 否,不包含必须组件 就可以。因为我们只是自定义Ribbon区所以那些组件可以不添加。
 然后我们需要点击 导出解决方案 讲这个解决方案作为 非托管解决方案 导出。
 
导出的解决方案是一个以 .zip 结尾的压缩文件,右击它,选择 全部提取 。
 
全部提取后的文件夹中有一个名称为 customizations.xml 的文件便是要手工编辑的文件了。为了更好的编辑这个文件,最好有些智能提示,这个我们可以利用SDK\Schemas中的架构文件。我们要用到的是名称为 CustomizationsSolution.xsd 的架构文件,但是这个架构文件引用了其他的架构文件,所以还是将这些架构文件放在同一个目录下为好。虽然用记事本也可以编辑这个 customizations.xml 文件,但是为了更加高效和准确我们使用Visual Studio来做。将 customizations.xml 使用Visual Studio打开。将 SDK\Schemas 文件夹中的如下文件 复制到Visual Studio 的安装目录:[安装目录]\Program Files (x86)\Microsoft Visual Studio X.0\Xml\Schemas  ,比如我这里是 C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas 这个文件夹。
CustomizationsSolution.xsd
fetch.xsd
FormXml.xsd
isv.config.xsd
RibbonCore.xsd
RibbonTypes.xsd
RibbonWSS.xsd
SiteMap.xsd
SiteMapType.xsd
VisualizationDataDescription.xsd
 
然后右击要编辑的 customizations.xml 文件 选择属性:
 
然后还要将光标放入这个文件的内容中,就可以看到 属性 那里有个架构,点击架构旁边的 [...] 图标,出来弹出对话框,但是因为这里没有我们要用到的 CustomizationsSolution.xsd 文件,所以点击添加按钮。
 
找到我们之前放在Visual Studio安装目录的CustomizationsSolution.xsd 文件添加进来,确保 使用列的勾勾处于选中状态(也就是选择 使用此架构 选项),然后点击 确定 按钮将其关闭。
 
然后就是在智能提示下修改解决方案中的 customizations.xml 文件了。找到XML文档中的 RibbonDiffXml 元素,可以看到没有编辑过的这个元素的值如下:
  1. <RibbonDiffXml>
  2. <CustomActions />
  3. <Templates>
  4. <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  5. </Templates>
  6. <CommandDefinitions />
  7. <RuleDefinitions>
  8. <TabDisplayRules />
  9. <DisplayRules />
  10. <EnableRules />
  11. </RuleDefinitions>
  12. <LocLabels />
  13. </RibbonDiffXml>
将 CustomActions 元素从空元素改成包括子元素的写法,输入 < ,你会发现有智能提示了。
 我这里修改很简单,增加了两个隐藏按钮的XML元素HideCustomAction,Location属性指出了它隐藏的按钮的ID,这个ID可以从导出的实体Ribbon定义文件中找到。HideActionId属性应该是保持唯一即可。
  1. <RibbonDiffXml>
  2. <CustomActions>
  3. <HideCustomAction Location="Mscrm.HomepageGrid.new_area.DeleteMenu" HideActionId="Mscrm.HomepageGrid.new_area.DeleteMenu.HideAction" />
  4. <HideCustomAction Location="Mscrm.Form.new_area.Delete" HideActionId="Mscrm.Form.new_area.Delete.HideAction" />
  5. </CustomActions>
  6. <Templates>
  7. <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  8. </Templates>
  9. <CommandDefinitions />
  10. <RuleDefinitions>
  11. <TabDisplayRules />
  12. <DisplayRules />
  13. <EnableRules />
  14. </RuleDefinitions>
  15. <LocLabels />
  16. </RibbonDiffXml>
修改保存后选中之前解决方案中的所有的文件,右击,选择 发送到 > 压缩(Zipped)文件夹。
 然后将这个压缩为文件导入到系统中,并在最后页面点击 发布所有自定义项 以发布你的更改。
 
然后我们刷新浏览器去看看效果,列表界面的删除按钮(组)不见了:
 实体表单界面的删除按钮也不见了:
 
当然不要以为看不到删除按钮就删除不了记录,还是可以通过其他方法删除的,比如高级查找功能,批量删除记录功能,通过代码的方式等等,最好不让用户删除的方式当然是移除用户对这个实体的删除权限。
 

Dynamics CRM命令栏定制基础知识及手动编辑customization.xml实例的更多相关文章

  1. Windows常用命令汇总以及基础知识

    命令部分: dir dir指定要列出的驱动器.目录和/或文件 ,/?显示所有命令 例:dir /b /s /o:n /a:a 表示显示当前路径下的所有文件的绝对路径,包含子文件夹的内容 /b表示去除摘 ...

  2. Redis命令总结及其基础知识讲述

    1.redis的不同之处 Redis拥有其他数据库不具备的数据结构,又拥有内存存储(这使得redis的速度非常快),远程操作(使得redis可以与多个客户端和服务器进行连接).持久化(使得服务器可以在 ...

  3. 《Linux基础知识及命令》系列分享专栏

    <Linux基础知识及命令>系列分享专栏 本专题详细为大家讲解了Linux入门基础知识,思路清晰,简单易懂.本专题非常适合刚刚学习Linux的小白来学习,通过学习该专题会让你由入门达到中级 ...

  4. Dynamics CRM定制子网格添加按钮实例之一

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复221或者20160430可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. Dynamics 365 CE命令栏按钮点击后刷新表单页面方法

    微软动态CRM专家罗勇 ,回复326或者20190428可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...

  6. Dynamics CRM通过定制应用程序功能区为符合条件的实体表单增加按钮

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复167或者20151029可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的博文都是为一个实体添加按钮 ...

  7. Dynamics CRM - 解决无法使用 Ribbon Workbench 2016 定制 Sub-Grid View Button 的问题(SubGrid MainTab 消失之谜)

    发现问题: 在 Dynamics CRM 开发中,会经常使用 Ribbon Workbench 工具来定制 Button 或者对已有 Button 进行自定义功能开发,比如隐藏 SubGrid 的 A ...

  8. Windows权限提升基础知识和命令

    介绍 这篇文章是介绍window的权限提升,虽然不是一个全面的指南,但会试图覆盖主要的技术,常用的资源列表在文章底部,可供大家参考. window权限提升基础知识 初始信息收集 在开始提权之前,我们需 ...

  9. Linux基础知识第九讲,linux中的解压缩,以及软件安装命令

    目录 Linux基础知识第九讲,linux中的解压缩,以及软件安装命令 一丶Linux Mac Windows下的压缩格式简介 2.压缩以及解压缩 3.linux中的软件安装以及卸载 1.apt进行安 ...

随机推荐

  1. 网易极客战记官方攻略-地牢-Kithgard 地牢

    关卡连接: https://codecombat.163.com/play/level/dungeons-of-kithgard 夺取宝石,逃出地牢--注意不要触碰其他东西.在这个关卡里,你会学习编写 ...

  2. Neo4j安装过程详解

    在安装neo4j之前,需要安装Java JRE,并配置Java开发环境,然后安装neo4j服务. 一.CentOS下安装 1.下载Neo4j 去官网下载最新的neo4j,选择社区版.地址:https: ...

  3. ubuntu1604环境下mariadb启动卡住报错和apparmor基本使用

    问题描述:Ubuntu 1604 新环境下使用apt安装的mariadb10版本,结果第二天就起不来了,很是郁闷 启动时会卡住,当时就慌了,这什么情况啊,昨天好好的今天就起不来了,过了一会儿就有返回信 ...

  4. harbor部署之SSL

    harbor部署之SSL 1 签名证书与自签名证书 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西. 自签名证书:由服务器自己颁发给自己,用于证明自己身份的东西,非权威颁发机构发布 ...

  5. vue/cli 3 引入 使用jQuery

    注意这里配置的是vue-cli3.0引入jquery的方法,不是vue-cli2.0的配置方法 一.安装jquery npm install jquery --save 二.一般安装成功后在packa ...

  6. IT兄弟连 HTML5教程 CSS3属性特效 弹性盒模型

    CSS3引入了新的盒模型——弹性盒模型,该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用的空间.使用该模型,可以很轻松的创建自适应浏览器窗口的流动布局或自适应字体大小的弹性布局.弹性盒模型看起 ...

  7. Python中的测试工具

      当我们在写程序的时候,我们需要通过测试来验证程序是否出错或者存在问题,但是,编写大量的测试来确保程序的每个细节都没问题会显得很繁琐.在Python中,我们可以借助一些标准模块来帮助我们自动完成测试 ...

  8. C# 读写倍福plc beckhoff , 使用ADS协议实现读取plc

    本文将使用库技术来读写倍福PLC数据,使用的是基于以太网的ADS实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://g ...

  9. IDEA的Maven设置阿里镜像

    作为一名.net开发学习java,虽然学习起来没啥难度,但是各种配置实在让人头大. 下面就简单记录下IDEA的Maven设置阿里镜像 进入开发软件的这个设置 点击进入 如图所示 第一个是你安装mave ...

  10. Spring注解之@Component详细解析

    @controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到sprin ...