Я нахожу ваш вопрос очень интересным, поэтому я подготовил демонстрационную версию , которая демонстрирует, как можно объединить Расширенный поиск диалог и Поиск по панели инструментов в одной сетке.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
).
Если вы заполните диалоговое окно расширенного поиска демо следующим полем
и нажмите кнопку «Найти», у вас будет следующая сетка:
(я пометил «Всего»столбец как недоступный для поиска в отношении search: false
, чтобы показать только то, что все работает правильно и в этом случае)
Можно видеть, что все поля панели инструментов поиска, за исключением «Количество», заполнены значениями издиалог поискаПоле не заполнено, потому что мы использовали операцию «больше или равно» вместо «равно».Функция refreshSerchingToolbar
заполняет только те элементы панели поиска, которые могут быть получены с помощью
. В качестве напоминания следует упомянуть, что в случае использования Панель инструментов фильтра это оченьважно определить searchoptions.sopt опции colModel
.Для всех нестроковых столбцов (даты, числа, выборки, целые числа, валюта) крайне важно иметь 'eq' в качестве первого элемента sopt
массива .Подробнее см. здесь и здесь .
Если вы измените фильтр расширенного диалога на следующий
у вас будет как положено
В конце я включаю код функции 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
явно инициировано.