Добавить Удалить обработчик столбца на jqGrid ColumnChooser
Я использую jqGrid columnChooser, вот так:
jQuery(grid).jqGrid(
'navButtonAdd',
pagerDiv,
{
caption: "Columns",
buttonicon: "ui-icon-newwin",
title: "Hide/Show Columns",
onClickButton: function () {
$(this).jqGrid('columnChooser', {
done: function (perm) {
if (perm) {
$(this).jqGrid('remapColumns', perm, true);
}
},
modal: true,
width: 400,
height: 300,
classname: 'column-chooser-select'
});
}
}
);
и мне было интересно, есть ли способ указать обработчик события для columnChooser (используя плагин jQuery UI Multiselect, который поставляется с jqGrid), который запускается каждый раз, когда столбец добавляется или удаляется. Итак, я думаю, что это вопрос из двух частей:
- JQuery UI Multiselect поддерживает такую вещь?
- если так, есть ли способ подключить его без изменения источника jqGrid?
Немного предыстории о том, чего я пытаюсь достичь:
Моя сеточная конфигурация по умолчанию скрывает много столбцов. Некоторые из этих столбцов не заполняются из БД - они представляют собой неясные, редко используемые элементы данных, которые в случае их заполнения значительно снизят производительность выполнения запроса (несколько объединений, включающих таблицы с более чем 100 миллионами записей).
Если пользователь выберет один из этих столбцов для отображения, я хотел бы предупредить его о том, что требуется другое обратное обращение к серверу, и это может занять некоторое время, - и дать им возможность отменить добавление столбца.
Спасибо
2 ответа
Я думаю, что понимаю вашу проблему и нахожу ваш вопрос интересным, поэтому я написал для вас демо, в котором показано, как можно решить проблему.
columnChooser использует внутренний модуль JQuery UI Multiselect, который использует jQuery UI Sortable. Поэтому я предлагаю использовать sortreceive событие jQuery UI Sortable для сбора необходимой информации.
Код может быть следующим
$("#grid").jqGrid('navButtonAdd', '#pager', {
caption: "",
buttonicon: "ui-icon-calculator",
title: "Choose columns",
onClickButton: function () {
$(this).jqGrid('columnChooser');
$("#colchooser_" + $.jgrid.jqID(this.id) + " ul.selected")
.bind("sortreceive", function (event, ui) {
alert('column "' + ui.item.text() + '" is choosed');
});
$("#colchooser_" + $.jgrid.jqID(this.id) + " ul.available a.action")
.click(function () {
alert('column "' + $(this).parent().text() + '" is choosed');
});
}
});
Смотрите демо здесь.
Код привязывает событие "click" к "+" для начального списка столбцов, который был в окне выбора столбцов во время инициализации диалога. Я думаю, что это будет достаточно для вас. При необходимости вы можете легко изменить код для поддержки "клика" на "+" для столбцов, которые будут удалены из левого списка при работе с columnChooser
,
Я почти забыл упомянуть, что я использовал в демо-версии улучшенную columnChooser
(см. ответ), но мое предложение выше работает с оригинальной версией columnChooser
тоже.
Я использую приведенный ниже код в JqGrid для плагина выбора столбца. когда я поставлю галочку в окошке выбора Все в сетке. Я хочу исключить определенный столбец (по умолчанию он не должен отображаться в моей сетке).
Я использовал свойство hidden=True в модели col. купить я хочу справиться с этим в колонке выбора также.
function Properties_Columnchooser() {
$('#btn_setColumns').click(function () {
jQuery('#grid-tableProperties').jqGrid('columnChooser',{
"shrinkToFit" : true,
"autowidth" : true,
done : function(perm) {
w = $(window).width();
// alert('done ' + w);
if (perm)
{
this.jqGrid("remapColumns", perm, true);
this.setGridWidth(w - 30, true);
$('.ui-search-input').show();
}
else
{
}
}
}
);
});
}