Вот код, который я написал, чтобы добавить средство выбора столбцов в сетку:
var navButton = {
caption: window.Constants.Grid.ShowHideColumns,
onClickButton: function () {
$(context.grid).jqGrid('columnChooser', {
width: 260,
height: 280,
classname: "column-chooser",
msel_opts: { //multiselect options
autoOpen: true,
header: false,
height: "auto",
classes: "column-chooser",
beforeclose: function () { return false; } //keep multiselect drop down open
},
dlog_opts: { //dialog options
modal: false,
resizable: false,
draggable: false,
dialogClass: "column-chooser",
buttons: [
{
text: window.Constants.Dialog.OK,
click: function() {
var colModel = $(context.grid).jqGrid("getGridParam", "colModel");
$(".column-chooser .ui-multiselect-checkboxes li input[type=checkbox]").each(function () {
var colName = colModel[parseInt($(this).val(), 10)].name;
$(this).attr("checked") ? $(context.grid).showCol(colName) : $(context.grid).hideCol(colName);
});
$(this).dialog("close");
}
},
{ text: window.Constants.Dialog.Cancel, click: function () { $(this).dialog("close"); } }
],
close: function () {
$(".column-chooser").remove(); //remove all elements
PopupBox.hideFullOverlay();
}
}
});
PopupBox.showFullOverlay();
}
};
var pager = $(context.grid).jqGrid("getGridParam", "pager");
$(context.grid)
.jqGrid("navGrid", pager, { edit: false, add: false, del: false, search: false, refresh: false, cloneToTop: true }) //add a nav grid to the pager and top pager
.jqGrid("navButtonAdd", pager, navButton) //add column button to pager
.jqGrid("navButtonAdd", context.grid + "_toppager", navButton); //add column button to top pager
Таким образом, в этом коде context.grid является идентификатором сетки, и этот код называется после создания сетки (то есть после строки, выглядящей как $(context.grid).jqGrid({ /* insert colmodel, pager name, etc */ })
)
Вот что делается для решения всех моих проблем:
- Кнопки «ОК» и «Отмена» не отображаются: кнопки указаны в параметрах
- для того, чтобы мультиселект был незакрытым: оставьте
return false
перед закрытием, но удалите select
со страницы с элементом close в dlog_opts. Каким-то образом select
остается на странице (как дочерний по отношению к корневому узлу).
- Устранение того факта, что выбирающий не показывался дважды: то же самое. Удалите все элементы, когда диалоговое окно закрыто.
Я делаю это, устанавливая один и тот же класс на каждый созданный объект (множественный выбор, выбор, диалог). Когда я использую его, я удаляю все из моего HTML, используя этот класс.
Основная проблема заключается в том, что jqGrid не создает надлежащую html-иерархию для элементов, возможно, из-за того, как работает плагин множественного выбора (он скрывает элемент select
и создает рядом с ним список ul
, содержащий флажки). В итоге я обнаружил, что у меня есть 3 элемента div, один из которых содержит диалог, другой содержит ul
, а другой содержит select
, все прямые потомки элемента body
. При закрытии jqGrid покидает элемент select
, и это нарушает его при втором открытии меню выбора.