定制列表界面打开记录的行为以便执行自定义操作的示例

我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),这是我的第480篇原创文章,写于2022年8月29日。

我们知道在表的列表界面(含子网格,主要列表界面)中通过如下方式会打开这条记录的表单(详情页面):

  1. 双击某条记录,或者点击这条记录的主字段(主字段一般显示为超链接);
  2. 选择某条记录,然后点击键盘上的 Enter 键;
  3. 在支持触摸的设备(touch-enabled device)上选择某条记录

但是有些时候我们不想打开记录的表单,想覆盖这种行为,以前做不到,现在可以了,请参考官方文档:​​Override the default open behavior of data rows in an entity-bound grid​​ ,但是官方文档写得是手工修改解决方案的customization.xml文件来做,我也有写过类似文章 ​​Dynamics CRM命令栏定制基础知识及手动编辑customization.xml实例​​​,估计做起来稍微麻烦点,我今天也来做下,但是使用RibbonWorkbench,达到的效果是覆盖在列表界面双击或者其他方式打开表单的行为,改成打开一个侧边栏,侧边栏显示一个Custom Page,关于Custom Page可以参考我的博文:​​在Model-Driven App中使用自定义页面(Custom Page)​​​ 。关于列表界面添加按钮的方法可以参考我之前的博文:​​Dynamics 365定制:在实体的列表界面添加按钮​​ 。

需要在实体的列表命令栏新建一个按钮,记得这个按钮的Id一定要设置为 Mscrm.OpenRecordItem :

定制列表界面打开记录的行为以便执行自定义操作的示例

这个按钮关联的Command自己新建,为了保险起见,我一般也命名为 Mscrm.OpenRecordItem,这里执行的操作如下:

定制列表界面打开记录的行为以便执行自定义操作的示例

执行的代码如下,可以参考官方文档:​​Navigating to a custom page using client API​​ 。

"use strict";
var LuoYong = window.LuoYong || {};
LuoYong.TestEntity = LuoYong.TestEntity || {};
(function () {
this.OpenRecordItem = function (selectedControlSelectedItemReferences) {
if (selectedControlSelectedItemReferences && selectedControlSelectedItemReferences.length === 1) {
console.log(selectedControlSelectedItemReferences);
var pageInput = {
pageType: "custom",
name: "ly_luoyongdemocustompageapp_b9378",
entityName: selectedControlSelectedItemReferences[0].TypeName,
recordId: selectedControlSelectedItemReferences[0].Id,
};
var navigationOptions = {
target: 2,
position: 2,
width: { value: 500, unit: "px" },
title: "查看图片"
};
Xrm.Navigation.navigateTo(pageInput, navigationOptions)
.then(
function () {
// Called when the dialog closes
}
).catch(
function (error) {
// Handle error
}
);
}
};
}).call(LuoYong.TestEntity);

为了让只选择一条记录的时候才可见,我还给这个按钮加了一个Enable Rule如下:

定制列表界面打开记录的行为以便执行自定义操作的示例

相关资源发布以后,列表界面选择一条记录,就可以看到按钮“查看详情”了,点击就会在右侧

定制列表界面打开记录的行为以便执行自定义操作的示例

当然拉,通过本文开头提到的三种方法也和点击“查看详情”按钮是一样的效果。那你会问,如果我要打开这个记录的表单呢?选择记录,点击标准的 Edit 按钮即可。

定制列表界面打开记录的行为以便执行自定义操作的示例

你可能会问,如果我将自己新增的这个“查看详情”按钮一直隐藏,效果还会存在嘛?官方文档说 You can enable or disable the button; doing either will still override the open default behavior.,我们也去实验下。按照 ​​Define custom actions to modify the ribbon​​ 的建议,我添加两个互斥的Display Rule,然后导入并发布。

            <DisplayRules>
<DisplayRule Id="Mscrm.HideOnModern" />
<DisplayRule Id="Mscrm.ShowOnlyOnModern" />
</DisplayRules>

定制列表界面打开记录的行为以便执行自定义操作的示例

但是这个做法导致按钮一直隐藏,而且双击打开记录的时候也不会用我定义的新操作代替。囧。

于是我换了一个方法,为这个按钮的增加一个一直会返回False的EntityRule。

定制列表界面打开记录的行为以便执行自定义操作的示例

然后可以看到,按钮虽然不见了,双击可以执行我定义的操作了,而不是打开记录表单了。

定制列表界面打开记录的行为以便执行自定义操作的示例

发表评论

相关文章