我们经常在表单中会用到subgrid控件,通常在一个表单中插入subgrid用来显示另外一个实体中的记录,而显示的内容我们是通过定义不同的视图来进行显示的,也可以通过javascript来进行一些控制。
今天这篇博文我们使用另外一种方法来实现灵活的在subgrid上来显示自定义的记录,这就需要用到我们今天的主角setFilterXml。
Note: 需要事先说明一下,这个setFilterXml并没有出现在微软的官方文档中,所以不确定有哪些版本支持,哪些版本不支持,我试过的是Dynamics 365 9.0 On-premises和Dynamcis 365 9.2 online这个两个版本。
以下图为例,我们在实体contact的表单中插入了一个Account实体的Subgrid
然后我们打开contact的一条记录后,会看到Account的subgrid控件显示的全部Account
打开F12的浏览器调试模式,首先获取这个Subgrid控件
var subgrid = Xrm.Page.getControl("AccountsSubgridTest")
通过这个控件我们可以查看它现有的filter
subgrid.getFetchXml()
比如我们只想在这个subgrid中显示Account Name为A开头的所有记录,那么我们使用高级查找功能将这个FetchXML下载下来。
但要注意我们需要将里面的双引号替换成单引号,并且只要filter标签中的内容。
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='account'>
<attribute name='name' />
<attribute name='primarycontactid' />
<attribute name='telephone1' />
<attribute name='accountid' />
<order attribute='name' descending='false' />
<filter type='and'>
<condition attribute='name' operator='like' value='A%' />
</filter>
</entity>
</fetch>
也就是
<filter type='and'><condition attribute='name' operator='like' value='A%' /></filter>
然后运行下面的代码来设置这个subgrid的filter
subgrid.setFilterXml("<filter type='and'><condition attribute='name' operator='like' value='A%' /></filter>");
最后刷新一下
subgrid.refresh();
最后我们就可以看到显示的效果了
通常我们可以使用setFilterXml这个方法在onload事件中来实现显示记录的自定义功能,它会比我们使用视图中过滤条件自由度更高,并且可以根据你代码中不同条件来显示不同的记录,来达到我们想要的效果。