Я использую jqgrid и фильтр панели инструментов. по умолчанию его просто дает вам текстовое поле для ввода данных. Поддерживает ли она выпадающее меню select combobox, где я могу дать ему список значений, на которые можно выбрать фильтр?
Может jqgrid поддерживать выпадающие списки в полях фильтра панели инструментов
Ответ 1
Существует несколько общих правил для всех типов сортировки в jqGrid
{
name: 'Category', index: 'Category', width: 200, formatter:'select',
stype: 'select', searchoptions:{ sopt:['eq'], value: categoriesStr }
}
где categoriesStr
определяются как
var categoriesStr = ":All;1:sport;2:science";
Здесь дополнительно к стандартным значениям "1: спорт; 2: наука" вставлена строка ": Все", которая позволяет вам не фильтровать столбец. Вы можете, конечно, использовать ":" или ": Выбрать..." и т.д.
В демонстрационная версия, подготовленная для , вы можете увидеть тесные результаты.
ОБНОВЛЕНО. Я нахожу ваш вопрос интересным и сделал демо. В нем показано, как можно создавать избранные комбобоксы, которые можно использовать на панели инструментов поиска или в расширенном диалоговом окне поиска на основе текста, содержащего соответствующий столбец. Для одного столбца я дополнительно использую jQuery UI autocomplete. Вы можете изменить код, чтобы использовать более разные мощные параметры автозаполнения. Вот код кода:
var mydata = [
{id:"1", Name:"Miroslav Klose", Category:"sport", Subcategory:"football"},
{id:"2", Name:"Michael Schumacher", Category:"sport", Subcategory:"formula 1"},
{id:"3", Name:"Albert Einstein", Category:"science", Subcategory:"physics"},
{id:"4", Name:"Blaise Pascal", Category:"science", Subcategory:"mathematics"}
],
grid = $("#list"),
getUniqueNames = function(columnName) {
var texts = grid.jqGrid('getCol',columnName), uniqueTexts = [],
textsLength = texts.length, text, textsMap = {}, i;
for (i=0;i<textsLength;i++) {
text = texts[i];
if (text !== undefined && textsMap[text] === undefined) {
// to test whether the texts is unique we place it in the map.
textsMap[text] = true;
uniqueTexts.push(text);
}
}
return uniqueTexts;
},
buildSearchSelect = function(uniqueNames) {
var values=":All";
$.each (uniqueNames, function() {
values += ";" + this + ":" + this;
});
return values;
},
setSearchSelect = function(columnName) {
grid.jqGrid('setColProp', columnName,
{
stype: 'select',
searchoptions: {
value:buildSearchSelect(getUniqueNames(columnName)),
sopt:['eq']
}
}
);
};
grid.jqGrid({
data: mydata,
datatype: 'local',
colModel: [
{ name:'Name', index:'Name', width:200 },
{ name:'Category', index:'Category', width:200 },
{ name:'Subcategory', index:'Subcategory', width:200 }
],
sortname: 'Name',
viewrecords: true,
rownumbers: true,
sortorder: "desc",
ignoreCase: true,
pager: '#pager',
height: "auto",
caption: "How to use filterToolbar better locally"
}).jqGrid('navGrid','#pager',
{edit:false, add:false, del:false, search:false, refresh:false});
setSearchSelect('Category');
setSearchSelect('Subcategory');
grid.jqGrid('setColProp', 'Name',
{
searchoptions: {
sopt:['cn'],
dataInit: function(elem) {
$(elem).autocomplete({
source:getUniqueNames('Name'),
delay:0,
minLength:0
});
}
}
});
grid.jqGrid('filterToolbar',
{stringResult:true, searchOnEnter:true, defaultSearch:"cn"});
Это то, что вы хотите?
ОБНОВЛЕНО. Еще одним вариантом может быть использование плагина select2, который сочетает в себе преимущества выпадающего списка и удобный поиск по автозаполнению. См. ответ и этот (см. Демонстрацию) для демонстраций (этот и этот) и примеры кода.
ОБНОВЛЕНО 2: Ответ содержит модификацию вышеприведенного кода для работы с jqGrid 4.6/4.7 или с бесплатный jqGrid 4.8.
Ответ 2
У меня была аналогичная ситуация. Благодаря отличному примеру Олега, это почти решило проблему. Было одно небольшое улучшение, в котором я нуждался. Моя сетка представляет собой сетку loadonce, которая имеет около 40 строк, 10 на страницу. Метод getCol, использованный выше, возвращает только текущие значения столбца страницы. Но я хотел заполнить фильтр уникальными значениями по всему набору данных. Итак, здесь небольшая модификация функции getUniqueNames:
var getUniqueNames = function(columnName) {
// Maybe this line could be moved outside the function
// If the data is really huge then the entire segregation could
// be done in a single loop storing each unique column
// in a map of columnNames -> unique values
var data = grid.jqGrid('getGridParam', 'data');
var uniqueTexts = [], text, textsMap = {}, i;
for (i = 0; i < data.length; i++) {
text = data[i][columnName];
if (text !== undefined && textsMap[text] === undefined) {
// to test whether the texts is unique we place it in the map.
textsMap[text] = true;
uniqueTexts.push(text);
}
}
// Object.keys(textsMap); Does not work with IE8:
return uniqueTexts;
}
Ответ 3
Я просто сделал это сам. Он чувствовал себя немного взломанным, но он работает!
- Создан новый "navButtonAdd" и для "caption", добавлен html-код для выпадающего списка.
- Функция onclickButton ничего не содержит.
-
Затем я создал функцию onchange для обработки перезагрузки сетки, когда она имеет значение изменилось.
$('#myGrid').jqGrid('navButtonAdd', '#myGrid_toppager', { caption: "<select id='gridFilter' onchange='ChangeGridView()'><option>Inbox</option><option>Sent Messages</option></select>", title: "Apply Filter", onClickButton: function () { } }); function ChangeGridView() { var gridViewFilter = $("#gridFilter").val(); $('#myGrid').setGridParam({ datatype: 'json', url: '../../Controller/ActionJSON', postData: { msgFilter: gridViewFilter } }); $('#myGrid').trigger("reloadGrid"); };
Надеюсь, что это поможет!
Ответ 4
категория - это имя столбца.
loadComplete: function () {
$("#" + TableNames).setColProp('Category', {
formatter: 'select', edittype: "select",
editoptions: { value: "0:MALE;1:FEMALE;2:other;" }
});
},