关注本人微信和易信公众号: 微软动态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行。
        static void Main(string[] args)
{
var service = GetOrganizationService();
RetrieveApplicationRibbonRequest appribReq = new RetrieveApplicationRibbonRequest();
RetrieveApplicationRibbonResponse appribResp = (RetrieveApplicationRibbonResponse)service.Execute(appribReq);
File.WriteAllBytes(@"D:\luoyong\applicationRibbon.xml", unzipRibbon(appribResp.CompressedApplicationRibbonXml));
Console.WriteLine("程序运行完成!");
Console.ReadKey();
} /// <summary>
/// A helper method that decompresses the the Ribbon data returned
/// </summary>
/// <param name="data">The compressed ribbon data</param>
/// <returns></returns>
static byte[] unzipRibbon(byte[] data)
{
System.IO.Packaging.ZipPackage package = null;
MemoryStream memStream = null; memStream = new MemoryStream();
memStream.Write(data, , data.Length);
package = (ZipPackage)ZipPackage.Open(memStream, FileMode.Open); ZipPackagePart part = (ZipPackagePart)package.GetPart(new Uri("/RibbonXml.xml", UriKind.Relative));
using (Stream strm = part.GetStream())
{
long len = strm.Length;
byte[] buff = new byte[len];
strm.Read(buff, , (int)len);
return buff;
}
}

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

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

按钮我们主要是能在三个地方用到看到,第一个就是实体的列表界面的命令栏,第二个打开显示一条记录的表单界面,第三个就是子网格也会有个命令栏。下面列举了会应用到每个实体命令栏的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 元素,可以看到没有编辑过的这个元素的值如下:
      <RibbonDiffXml>
<CustomActions />
<Templates>
<RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
</Templates>
<CommandDefinitions />
<RuleDefinitions>
<TabDisplayRules />
<DisplayRules />
<EnableRules />
</RuleDefinitions>
<LocLabels />
</RibbonDiffXml>
将 CustomActions 元素从空元素改成包括子元素的写法,输入 < ,你会发现有智能提示了。
 我这里修改很简单,增加了两个隐藏按钮的XML元素HideCustomAction,Location属性指出了它隐藏的按钮的ID,这个ID可以从导出的实体Ribbon定义文件中找到。HideActionId属性应该是保持唯一即可。
      <RibbonDiffXml>
<CustomActions>
<HideCustomAction Location="Mscrm.HomepageGrid.new_area.DeleteMenu" HideActionId="Mscrm.HomepageGrid.new_area.DeleteMenu.HideAction" />
<HideCustomAction Location="Mscrm.Form.new_area.Delete" HideActionId="Mscrm.Form.new_area.Delete.HideAction" />
</CustomActions>
<Templates>
<RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
</Templates>
<CommandDefinitions />
<RuleDefinitions>
<TabDisplayRules />
<DisplayRules />
<EnableRules />
</RuleDefinitions>
<LocLabels />
</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. Android 再次打开APP进入按Home键退出时的界面(thisTaskRoot)

    问题 Android 设置页面的启动模式为 singletask 之后,当按Home 退出时,再重新打开应用,还会进入首启动页.就会造成一些应用需要重新登录,当前页数据丢失等问题 解决 去除启动页的 ...

  2. Jsonp跨域原理及简单应用

    浏览器的同源策略: 同源策略(Same Origin Policy)是一种约定,它是由Netscape提出的一个著名的安全策略,它限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是 ...

  3. day03运算符、表达式、自增自减、三目运算符、程序结构、用户输入

    复习 1.java的输出语句 1)System.out.println(); 2)System.out.print(); 2.注释 1)单行注释 // 2)多行注释 /* .... */ 3.变量 1 ...

  4. IDEA 下使用JSTL 非maven

    原文链接:https://www.cnblogs.com/xiehang/p/9430342.html 习惯了eclipse和myeclipse开发的我们总是依赖于系统的插件,而当我想当然的以为Int ...

  5. java 整合redis缓存 SSM 后台框架 rest接口 shiro druid maven bootstrap html5

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...

  6. mongo [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating 2019-09-23T16:

    解决方法: 加权 sudo chmod -Rf 777 /data/db

  7. 从0系统学Android--3.5 最常用和最难用的控件---ListView

    从0系统学Android-- 3.5 最常用和最难用的控件---ListView 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.5 最常用和最难用的控件---ListView Lis ...

  8. 44-创建 Machine

    对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机.“创建 Machine” 指的就是在 host 上安装和部署 docker.先执行 doc ...

  9. mybatis报错: java.lang.IllegalArgumentException invalid comparison: java.util.Date and java.lang.String

    原因是在使用<if> 进行条件判断时, 将datetime类型的字段与 ' ' 进行了判断,导致的错误 解决, 只使用  <if test="createTime != n ...

  10. 寝室远程连接室友mysql数据库

    注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 首先需要修改mysql数据库的相关配置,将user表中的host改为 ...