Получить все строки, не отфильтрованные из jqGrid - PullRequest
6 голосов
/ 19 марта 2012

У меня есть локальные данные в сетке. Как я могу получить все строки или идентификаторы, которые не удаляются после того, как пользователь использует панель инструментов фильтра? Мне нужно получить все отфильтрованные строки, независимо от нумерации страниц.

Например, скажем, я начинаю с 50 строк в сетке. Пользователь использует панель инструментов фильтра, и набор строк уменьшается до 10 строк. Как я могу получить эти десять строк?

Ответы [ 4 ]

24 голосов
/ 23 марта 2012

Нет прямого способа получить нужную вам информацию. Внутренне jqGrid использует $. Jgrid.from для фильтрации локальных данных. Основной код, который использует $.jgrid.from внутри addLocalData . Чтобы получить результаты, которые вам нужны, без изучения всего кода, я предлагаю использовать тот факт, что все отфильтрованные данные будут возвращены select методом $.jgrid.from (см. строка кода). Я предлагаю перехватить данные, прежде чем они будут обрезаны до размера страницы.

Для этого я предлагаю использовать подклассификацию: перезапись метода select метод $.jgrid.from. Я демонстрирую технику в примерах, созданных для ответа и этого .

В вашем случае код будет

var oldFrom = $.jgrid.from,
    lastSelected;

$.jgrid.from = function (source, initalQuery) {
    var result = oldFrom.call(this, source, initalQuery),
        old_select = result.select;
    result.select = function (f) {
        lastSelected = old_select.call(this, f);
        return lastSelected;
    };
    return result;
};

Теперь переменная lastSelected сохранит массив элементов, которые являются результатами последней операции сортировки или фильтрации. Поскольку $.jgrid.from является глобальным, данные не связаны с сеткой. Если у вас есть более одной сетки на странице, это будет неудобно. Небольшой недостаток можно исправить с помощью следующей строки в коде loadComplate каждой сетки:

loadComplete: function () {
    this.p.lastSelected = lastSelected; // set this.p.lastSelected
}

Таким образом, мы вводим новый параметр jqGrid lastSelected, который будет иметь близкую структуру как параметр data, но будет содержать только последние отфильтрованные данные.

Следующий код отобразит идентификаторы отфильтрованных данных в alert сообщении

$("#getIds").click(function () {
    var filteredData = $grid.jqGrid('getGridParam', 'lastSelected'), i, n, ids = [],
        idName = $grid.jqGrid('getGridParam', 'localReader').id;
    if (filteredData) {
        for (i = 0, n = filteredData.length; i < n; i++) {
            ids.push(filteredData[i][idName]);
        }
        alert("tolal number of filtered data: " + n + "\n" +
            "ids of filtered data:\n" + ids.join(', '));
    }
});

Я использовал localReader.id параметр, потому что имя свойства, используемое для локальных данных, обычно id или _id_. _id_ будет использоваться в случае данных, загруженных с сервера, если используется опция loadonce: true.

Демо демонстрирует подход. Если один фильтр, например, только данные из FedEx, а затем нажать кнопку «Показать идентификаторы», то он увидит информацию обо всех отфильтрованных, а не только о данных, отображаемых на текущей странице:

enter image description here

enter image description here

ОБНОВЛЕНО : бесплатно jqGrid предоставляет новую опцию lastSelectedData. См. демоверсию в списке демонстраций .

1 голос
/ 23 марта 2012

Вы можете использовать опцию afterSearch панели инструментов поиска:

var filteredIDs = new Array(); //Global variable

$("#"+gridId).jqGrid("filterToolbar", { stringResult:true,  searchOnEnter:false,
                                        afterSearch:function(){
                                            filteredIDs = $("#"+gridId).getDataIDs();
                                        }
                                      }); 

Если вы хотите получить отфильтрованные строки вместо отфильтрованных идентификаторов, используйте getRowData () вместо getDataIDs ().

0 голосов
/ 27 сентября 2017

Все, что вы хотите, ниже:

$.each($grid.getRowData(), function( index, value ) {
  a.push(value["COLUMN_NAME"]); //Get the selected data you want
});
0 голосов
/ 23 марта 2016

Все, я нашел другой ответ, который гораздо проще включить

loadComplete: function (gridData) {
                    var isSearchPerformed = $grid.getGridParam("postData")._search;
                    if (isSearchPerformed) {
                        $("#spanFilterTotal").text(gridData.records);                        
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...