在MSCRM中让Lookup根据一定的条件实现过滤功能, 这个需求很常见, 在我接触的诸多项目中似乎都需要有这个功能. 但非常遗憾是, MSCRM 的SDK并没有提供实现这个功能的方法. 不过我们应该还是感到庆幸, 据说, 微软CRM产品组有透露下面这样的方法:

场景:

实体:

实体名 架构名
客户 account
联系人 contact

客户:

字段名 架构名 类型 关联实体
上级单位 parentaccountid lookup 客户
主要联系人 primarycontactid lookup 联系人

联系人:

字段名 架构名 类型 关联实体
上司 parentcustomerid lookup 客户

需求:

在客户实体中, 当选择上级单位后, 点击主要联系人Lookup按钮, 在弹出的lookup选择对话框中必须过滤出上司等于上级单位的所有联系人.

实现方法:

第一步:

进入高级查找, 根据需求设置查找条件。

点击查找,然后在地址栏中输入javascript:alert(resultRender.FetchXml.value);后回车, 获取fetchxml

第二步:

将第一步获取的Fetchxml做适当的修改,并将其在客户实体的OnLoad事件 和 上级单位的OnChange事件 中 对上级单位字段设置参数如下:

if(crmForm.all.primarycontactid.DataValue != null){
crmForm.all.primarycontactid.lookupbrowse = 1;
crmForm.all.primarycontactid.additionalparams = "search=<fetch version=\"1.0\" output-format=\"xml-platform\" mapping=\"logical\" distinct=\"false\"><entity name=\"contact\"><order attribute=\"fullname\" descending=\"false\"/><filter type=\"and\"><condition attribute=\"parentcustomerid\" operator=\"eq\" uiname=\""+crmForm.all.parentaccountid.DataValue[ 0 ].name+"\" uitype=\"account\" value=\""+crmForm.all.parentaccountid.DataValue[ 0 ].id+"\"/></filter></entity></fetch>";
}

第三步:

修改CRMWeb\_controls\lookup\lookupsingle.aspx文件,在该文件头部加入如下代码:
<script runat="server">
protected override void OnLoad( EventArgs e )
{
      base.OnLoad(e);
      crmGrid.PreRender += new EventHandler( crmgrid_PreRender );
}

void crmgrid_PreRender( object sender , EventArgs e )
{
      crmGrid.AddParameter( "fetchxml" , Request["search"] );
      crmGrid.Parameters.Remove( "searchvalue" );
}
</script>

OK, 以上就是传说中产品组透露的方法.实现的效果过下图:

从上图可以看到, 经过过滤后的lookup没有了查找框. 当然, 如果过滤后的出来的结果数据量并不是很大的话, 那么我个人认为已经满足需求, 但关键是, 如果过滤后的结果有几百条之多. 那么用户体验就差了. 也就在这个时候我们往往会想方设法去改善他.

接下来是我要谈到的重点, 如何在过滤后的lookup中实现查找

其实, 之前的方法之所以没有了查找框, 是在脚本中加了这么条语句:

crmForm.all.primarycontactid.lookupbrowse = 1; 但当这个值改为0时, 会出现下面的效果:

显然这并不是我们想要的结果

但这个结果也并不是最糟糕的, 至少它给了一个提示, 告诉我们可以在fetchxml上做文章.

没错, 还是偷梁换柱的方法, 但这里需要注意一点, 直接将fetchxml作为查找条件是得不出任何结果的. 在这里我们需要通过另外一种方式来实现.

其实, 经过分析lookup页面会发现, fetchxml 被存储在lookup页面的的一个隐藏div中, 如下图:

当点击视图的刷新按钮时, MSCRM自动的会根据fetchxml的条件重新加载数据.

通过以上信息, 便可很轻松的实现这个功能.

实现方法:

之前的三个步骤不变, 更改步骤二的代码如下:

if(crmForm.all.primarycontactid.DataValue != null){

crmForm.all.primarycontactid.lookupbrowse = 0;
crmForm.all.primarycontactid.additionalparams = "search=<fetch version=\"1.0\" output-format=\"xml-platform\" mapping=\"logical\" distinct=\"false\"><entity name=\"contact\"><order attribute=\"fullname\" descending=\"false\"/><filter type=\"and\"><condition attribute=\"fullname\" operator=\"like\" value=\"%%\"/><condition attribute=\"parentcustomerid\" operator=\"eq\" uiname=\""+crmForm.all.parentaccountid.DataValue[ 0 ].name+"\" uitype=\"account\" value=\""+crmForm.all.parentaccountid.DataValue[ 0 ].id+"\"/></filter></entity></fetch>";
}

在\CRMWeb\_controls\lookup\lookupsingle.aspx页面中添加如下代码, 并在onload中调用FindCriteria方法

function FindCriteria(){
    try{
        var criteriaObj = document.getElementById("findValue");
        var fetchObj = document.getElementById("fetchxml");
        var searchObj = document.getElementById("search");
        var criteriaObj2 = criteriaObj.cloneNode(true);

criteriaObj2.value = "";
        if(fetchObj.value == ""){
            criteriaObj.value = "*"+criteriaObj2.value;
            if(criteriaObj.value == "*"){criteriaObj.value = "";}
        }
        else{
            document.getElementById("btnGo").onclick = function(){
                document.getElementById("grid_refresh").click();
            }
        }
        criteriaObj2.onchange = function(){
            if(fetchObj.value == ""){
                criteriaObj.value = "*"+criteriaObj2.value;
                if(criteriaObj.value == "*"){criteriaObj.value = "";}
            }
            else{
                fetchObj.value = searchObj.value.replace("value=\"%%\"","value=\"%"+criteriaObj2.value.replace(/\*/g,"%") +"%\"");
                document.getElementById("btnGo").onclick = function(){
                    document.getElementById("grid_refresh").click();
                }
            }
        }
        criteriaObj2.id = "findCriteria2";
        criteriaObj.parentElement.appendChild(criteriaObj2);
        criteriaObj.style.position = "absolute";
        criteriaObj.style.zIndex = "1000";
        criteriaObj.style.left = "-1000px";
        criteriaObj.style.top = "-1000px";
        criteriaObj2.onkeydown = function(){
            if(event.keyCode==13){
                if(fetchObj.value == ""){
                    criteriaObj.value = "*"+criteriaObj2.value;
                    if(criteriaObj.value == "*"){criteriaObj.value = criteriaObj.value = "";}
                    document.getElementById("btnGo").click();
                }
                else{
                    fetchObj.value = searchObj.value.replace("value=\"%%\"","value=\"%"+criteriaObj2.value.replace(/\*/g,"%")+"%\"");
                    document.getElementById("btnGo").onclick = function(){
                        document.getElementById("grid_refresh").click();
                    }
                }
            }
        }
    }catch(e){alert(e.message)}
}

最终效果:

转载自http://www.cnblogs.com/xingbake/archive/2009/04/03/1428608.html

MSCRM4 在过滤后的LOOKUP框中实现查找的更多相关文章

  1. jquery选中将select下拉框中一项后赋值给text文本框

    jquery选中将select下拉框中一项后赋值给text文本框,出现无法将第一个下拉框的value赋值给文本框 因为select默认选中第一项..在选择第一项时,便导致无法激发onchange事件. ...

  2. AE二次开发中,过滤后的图层,实现缩放至图层效果

    //featureClass是自己获取的featureClass,也可是sde中获取的. public void FilterAndZoomToLayer(IFeatureClass featureC ...

  3. Easyui中 messager.alert 后某文本框获得焦点

    messager.alert 后某文本框获得焦点 $.messager.alert({ title:'消息', msg:'电话号码 只能是数字!', icon: 'info', width: 300, ...

  4. 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息

    如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...

  5. Visual Studio 打开解决方案后 弹出框显示 "正在打开文件..." 迟迟没反应 的解决方法

    Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 ...

  6. PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数

    XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function ...

  7. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

  8. c# winform进入窗口后在文本框里的默认焦点

    c# winform 设置winform进入窗口后在文本框里的默认焦点   进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这 ...

  9. 让下拉框中同时显示Key与Value

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. hadoop datanode usages方差算法

    stdDev 标准差(方差) 阐述及应用 简单来说,标准差是一组数值自平均值分散开来的程度的一种测量观念.一个较大的标准差,代表大部分的数值和其平均值之间差异较大:一个较小的标准差,代表这些数值较接近 ...

  2. [COGS 2264]魔法传输

    [COGS 2264]魔法传输 题目 自从看了<哈利波特>,小Y就十分渴望获得魔法值.于是他和一群向往魔法的孩子(当然这些孩子们都是不会魔法的)来到了哈利波特的家,大家坐成一排.哈利波特会 ...

  3. 请问spfa+stack 和spfa+queue 是什么原理

    一个是bfs加迭代 一个是dfs加迭代 请问迭代是什么 就是不断地做,做到没有更优的解为止 或者是不断得做,做到逼近答案为止.. 栈比队列更快更节省空间

  4. 关于Spring的xml文档的简单实用配置

    Spring的spring.xml文档的配置 最近在写Spring的配置文件时,发现Spring文档的配置其实没必要那么繁琐记忆,网上的很多文章都写得很繁琐,如果所有的东西按照路径去查找,可以很快的帮 ...

  5. Spring MVC-表单(Form)标签-单选按钮(RadioButton)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_radiobutton.htm 说明:示例基于Spring MVC 4.1.6. ...

  6. N天学习一个Linux命令之free

    用途 查看系统内存(物理/虚拟/缓存/共享)使用情况 用法 free [-b | -k | -m | -g | -h] [-o] [-s delay ] [-c count ] [-a] [-t] [ ...

  7. eclipse上导入import git项目

    1.左上角File->import->git eclipse 可以从很多来源处import项目,项目来源可以使git/maven/general等. import来源可以看下面 2.点击g ...

  8. AVPlayer的使用,带缓冲

    #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewCont ...

  9. 【JavaScript】离开页面前提示

    离开页面前的提示不能够用onunload去做,由于它仅仅是兼容IE,你要兼容Google与FireFox就蛋疼了. 并且这个事件还是关闭之后才会触发的. 取而代之能够用onbeforeunload去实 ...

  10. 使用Linq 查询数据 构建对象 select new{}

    linq 查询数据 /// <summary> /// 汽车品牌及车型 /// </summary> /// <returns></returns> p ...