如何删除addPreSearch过滤器

时间:2014-10-21 12:24:04

标签: dynamics-crm-2011 dynamics-crm crm dynamics-crm-4 dynamics-crm-2013

我正在尝试删除PreSearch文件管理器,我的代码如下所示。我怎样才能实现同样的目标?

Xrm.Page.getControl("productid").removePreSearch(function () {
    Object
});

Xrm.Page.getControl("productid").addPreSearch(function () {
    fetchxml2();
});

function fetchxml2() {
    var fetchXml1 = "<filter type='and'>"
    fetchXml1 += "<condition attribute='productid' operator='in' >";
    for (var i = 0; i < Itemid.length; i++) {
        fetchXml1 += "<value>" + Itemid[i] + "</value>";
    }

    fetchXml1 += "</condition>";
    fetchXml1 += "</filter>";
    Xrm.Page.getControl("productid").addCustomFilter(fetchXml1);
    //Xrm.Page.getControl("productid").removePreSearch(fetchXml1);

};

2 个答案:

答案 0 :(得分:7)

为了能够通过removePreSearch删除处理程序,请通过创建命名函数并在addPreSearchremovePreSearch中使用匿名函数来避免使用匿名函数:

function preSearchHandler(){
    fetchxml2();
}

Xrm.Page.getControl("productid").removePreSearch(preSearchHandler);

Xrm.Page.getControl("productid").addPreSearch(preSearchHandler);

答案 1 :(得分:0)

只想将其添加到讨论中:

例如,如果您在查找字段上具有三个不同的自定义过滤器,则当您应用新的过滤器时,该功能将会堆叠。

例如,如果您有一个在字段上调用addPreSearch()的选项集,则如果选择所有三个不同的选项,则会将所有三个过滤器同时应用于该字段。

说选项集有三个选项[选项A,选项B,选项C],

为简单起见,相应的功能为[filterA,filterB,filterC]

对于选项集的change事件,对于您应用的每个过滤器,只需删除其他两个过滤器(在这种情况下)。

if (optionSet == 810500000) {//option A

Xrm.Page.getControl('lookup').addPreSearch(filterA);
Xrm.Page.getControl('lookup').removePreSearch(filterB);
Xrm.Page.getControl('lookup').removePreSearch(filterC);
}
else if (optionSet == 810500001) {//option B

Xrm.Page.getControl('lookup').addPreSearch(filterB);
Xrm.Page.getControl('lookup').removePreSearch(filterA);
Xrm.Page.getControl('lookup').removePreSearch(filterC);
}//so on and so forth

我希望这对某人有帮助,我能够将自定义过滤器应用于基于四个不同选择的查找,并通过这种方式添加和删除“可堆叠”过滤器。这有点难看,但是,嘿,它有效。归根结底,有时最优雅的解决方案是仅仅赢,赢双赢。

如果您需要更多上下文(fetchXml)等,我也可以发布它...但是它与我试图提出的观点并不一致。这些过滤器可以同时应用!这是我想在这里传达的主要思想。