2017-02-20 10 views
0

Я хочу отфильтровать поиск по нескольким полям в одной форме. Проблема заключается в том, что только последний обработчик событий, который я добавил, применим ко всем полям. Для этого я хотел использовать контекст, чтобы получить поле, которое в настоящее время используется. Но фильтры применяются в событии «onload» формы, где у меня нет выбранного контекста/поля.Отфильтрованный поиск нескольких полей

Для этого я использую этот код:

function preFilterLookupFunction(executionContext) 
{ 
    var fieldname = new Array("field1","field2"); 
    fLen = fieldname.length; 

    for (i = 0; i < fLen; i++) 
    { 
     var tempName = fieldname[i]; 
     Xrm.Page.getControl(tempName).addPreSearch(function() 
     { 
     addLookupFilterFunction(executionContext); 
     }); 
    } 
} 

function addLookupFilterFunction(executionContext) 
{ 
    var attribute = executionContext.getEventSource(); 
    var tempFieldName = attribute.getName(); 
    alert(tempFieldName) 
    var condition = Xrm.Page.getAttribute("fieldContition").getValue(); 
    if (condition != null) 
    { 
     var fetchXml = "<filter type='and'><condition attribute='fieldContition' operator='eq' value='" + condition + "' /></filter>";    
     Xrm.Page.getControl(tempFieldName).addCustomFilter(fetchXml); 
    }  
} 

Мой вопрос: можно ли получить контекст в addLookupFilterFunction во время выполнения, так что я могу установить фильтр в правом поле? Или есть лучший способ фильтровать несколько полей в одной форме?

+2

Nice ПИК Twiebie. – user7393973

+0

Вам нужно применить тот же фильтр к более чем одному поиску в форме? Правильно ли я понял? (Кстати: это тот самый код, который я бы написал сначала) – Alex

+0

@Alex да, действительно. но я не хочу добавлять обработчик событий для каждого поля отдельно. – Twiebie

ответ

0

Ключ в том, что вам не нужно передавать параметр executeContext.

В вызове функции addLookupFilterFunction(executionContext) executeContext ссылается на переменную аргумента функции preFilterLookupFunction(executionContext), которая будет одинаковой для каждой итерации цикла for.

Заменить этот код:

Xrm.Page.getControl(tempName).addPreSearch(function() 
{ 
    addLookupFilterFunction(executionContext); 
}); 

этим:

Xrm.Page.getControl(tempName).addPreSearch(addLookupFilterFunction); 
+0

Я пробовал это, но это приводит к тому же, что и раньше, только последний элемент управления в списке получил (правый) фильтр, все остальные элементы управления получают фильтр последнего элемента управления, упомянутого в цикле for. Я обошел эту проблему, добавив отдельное funtion для каждого элемента управления и назову его при загрузке формы, но функция с циклом для всех элементов управления все еще не работает. – Twiebie

+0

Когда вызывается 'preFilterLookupFunction', один раз в onload формы? –

+0

Да, он называется один раз в onLoad формы – Twiebie

Смежные вопросы