Два связанных вопроса о фильтрах заголовков столбцов jqGrid и диалоге расширенной фильтрации - PullRequest
5 голосов
/ 29 июля 2011

При разработке моего первого приложения ASP.NET MVC 3 с использованием jqGrid для отображения некоторых данных я использую фильтры заголовков столбцов, а также позволяю выполнять расширенную фильтрацию на панели инструментов фильтров.Независимо от этого, эти вещи работают довольно хорошо.

Первый вопрос - Кто-нибудь имеет решение для передачи текущих настроек фильтра заголовка столбца в расширенные фильтры?

Например, пользователь может фильтровать по столбцу «Имя мороженого», вводя частичное имя, например, «Шоколад», и оно будет фильтроваться до «Взрыв шоколада», «Темный шоколад».и т. д. - отлично.Было бы неплохо открыть расширенный фильтр и автоматически заполнить фильтр столбцов «содержит шоколад» в расширенном фильтре.Я признаю, что другое направление (где кто-то может И или ИЛИ два значения для одного и того же столбца, например, «Шоколад» ИЛИ «Карамель») становится проблематичным, но в другом направлении кажется, что это возможно.Возможно, это просто настройка сетки, которую мне не хватает.Кто-нибудь решил эту проблему?

Второй вопрос - В настоящее время я могу выполнить некоторую фильтрацию с помощью фильтров заголовка столбца, показать некоторый набор результатов в сетке, а затем перейти в диалоговое окно расширенного фильтра и настроитьдругой фильтр.Это будет отображать правильные результаты, но фильтры заголовков столбцов не очищаются, создавая впечатление, что фильтрация не работает.Как я могу сбросить фильтры заголовков столбцов после того, как пользователь нажмет кнопку «Найти» в диалоговом окне?

Ответы [ 2 ]

17 голосов
/ 30 июля 2011

Я нахожу ваш вопрос очень интересным, поэтому я подготовил демонстрационную версию , которая демонстрирует, как можно объединить Расширенный поиск диалог и Поиск по панели инструментов в одной сетке.1007 *

Одним из важных, но простых приемов является использование recreateFilter: true.По умолчанию диалог поиска будет создан один раз, а затем будет только скрывать или показывать.В результате параметр postData.filters не будет обновлен.После установки recreateFilter: true проблема с заполнением диалогового окна расширенного поиска значениями из панели инструментов поиска будет решена.Я лично установил параметры поиска по умолчанию следующим образом:

$.extend(
    $.jgrid.search,
    {
        multipleSearch: true,
        multipleGroup: true,
        recreateFilter: true,
        overlay: 0
    }
);

Теперь более сложной частью решения является функция refreshSerchingToolbar, которую я написал.Функция не так проста, но она просто используется:

loadComplete: function () {
    refreshSerchingToolbar($(this), 'cn');
}

Последний параметр - это тот же параметр, который вы использовали в качестве свойства defaultSearch метода панели инструментов поиска filterToolbar (значение по умолчанию:'bw', но я лично предпочитаю использовать 'cn' и установить параметр jqGrid ignoreCase: true).

Если вы заполните диалоговое окно расширенного поиска демо следующим полем

enter image description here

и нажмите кнопку «Найти», у вас будет следующая сетка:

enter image description here

(я пометил «Всего»столбец как недоступный для поиска в отношении search: false, чтобы показать только то, что все работает правильно и в этом случае)

Можно видеть, что все поля панели инструментов поиска, за исключением «Количество», заполнены значениями издиалог поискаПоле не заполнено, потому что мы использовали операцию «больше или равно» вместо «равно».Функция refreshSerchingToolbar заполняет только те элементы панели поиска, которые могут быть получены с помощью

. В качестве напоминания следует упомянуть, что в случае использования Панель инструментов фильтра это оченьважно определить searchoptions.sopt опции colModel.Для всех нестроковых столбцов (даты, числа, выборки, целые числа, валюта) крайне важно иметь 'eq' в качестве первого элемента sopt массива .Подробнее см. здесь и здесь .

Если вы измените фильтр расширенного диалога на следующий

enter image description here

у вас будет как положено

enter image description here

В конце я включаю код функции refreshSerchingToolbar:

var getColumnIndex = function (grid, columnIndex) {
        var cm = grid.jqGrid('getGridParam', 'colModel'), i = 0, l = cm.length;
        for (; i < l; i += 1) {
            if ((cm[i].index || cm[i].name) === columnIndex) {
                return i; // return the colModel index
            }
        }
        return -1;
    },
    refreshSerchingToolbar = function ($grid, myDefaultSearch) {
        var postData = $grid.jqGrid('getGridParam', 'postData'), filters, i, l,
            rules, rule, iCol, cm = $grid.jqGrid('getGridParam', 'colModel'),
            cmi, control, tagName;

        for (i = 0, l = cm.length; i < l; i += 1) {
            control = $("#gs_" + $.jgrid.jqID(cm[i].name));
            if (control.length > 0) {
                tagName = control[0].tagName.toUpperCase();
                if (tagName === "SELECT") { // && cmi.stype === "select"
                    control.find("option[value='']")
                        .attr('selected', 'selected');
                } else if (tagName === "INPUT") {
                    control.val('');
                }
            }
        }

        if (typeof (postData.filters) === "string" &&
                typeof ($grid[0].ftoolbar) === "boolean" && $grid[0].ftoolbar) {

            filters = $.parseJSON(postData.filters);
            if (filters && filters.groupOp === "AND" && typeof (filters.groups) === "undefined") {
                // only in case of advance searching without grouping we import filters in the
                // searching toolbar
                rules = filters.rules;
                for (i = 0, l = rules.length; i < l; i += 1) {
                    rule = rules[i];
                    iCol = getColumnIndex($grid, rule.field);
                    cmi = cm[iCol];
                    control = $("#gs_" + $.jgrid.jqID(cmi.name));
                    if (iCol >= 0 && control.length > 0) {
                        tagName = control[0].tagName.toUpperCase();
                        if (((typeof (cmi.searchoptions) === "undefined" ||
                              typeof (cmi.searchoptions.sopt) === "undefined")
                             && rule.op === myDefaultSearch) ||
                                (typeof (cmi.searchoptions) === "object" &&
                                    $.isArray(cmi.searchoptions.sopt) &&
                                    cmi.searchoptions.sopt[0] === rule.op)) {

                            if (tagName === "SELECT") { // && cmi.stype === "select"
                                control.find("option[value='" + $.jgrid.jqID(rule.data) + "']")
                                    .attr('selected', 'selected');
                            } else if (tagName === "INPUT") {
                                control.val(rule.data);
                            }
                        }
                    }
                }
            }
        }
    };

ОБНОВЛЕНО : приведенный выше код больше не требуется в случае использования free jqGrid 4.13.1 или выше.Он содержит новую опцию по умолчанию loadFilterDefaults: true из filterToolbar, которая обновляет значения панели инструментов фильтра и операций фильтрации (если searchOperators: true опция filterToolbar установлена), если postData.filtersи search: true установлены (фильтр применен).Free jqGrid обновляет панель инструментов фильтра на jqGridAfterLoadComplete (если установлено loadFilterDefaults: true) или если событие jqGridRefreshFilterValues явно инициировано.

1 голос
/ 27 февраля 2013

Я знаю, что это старая запись, но если у вас есть несколько сеток на одной странице, приведенный выше код может добавить текст фильтра в неправильную сетку.

Изменение этого параметра в первом цикле в refreshSearchingToolbar, начиная с

control = $("#gs_" + $.jgrid.jqID(cm[i].name));

до

control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cm[i].name));

, и это во втором цикле от

control = $("#gs_" + $.jgrid.jqID(cmi.name));

до

control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cmi.name));

должно помочь.

Слава Олегу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...