Я лично нахожу вопрос очень хорошим.Я делаю много предложений, как улучшить алгоритм расчета ширины сетки.Дважды я включал в свои предложения поведение, которое вы хотите, но Тони (разработчик jqGrid) удалил часть изменений.
Реализовать ваши требования в текущей версии jqGrid очень просто, но кодиспользует некоторые внутренние структуры сетки.Поэтому вы должны проверить, будет ли этот трюк работать и в следующих версиях.Код обратного вызова resizeStop
может быть следующим:
resizeStop: function () {
$(this.bDiv).find('>div:first>table.ui-jqgrid-btable:first')
.jqGrid('setGridWidth', this.newWidth);
}
Демонстрация показывает в реальном времени, как это работает.
Сложность общего решения дляjqGrid выше, потому что иногда нужно удерживать заданную ширину сетки.Моя точка зрения здесь следующая: если пользователь указывает опцию width
во время инициализации сетки (создания) , то он хочет удерживать ширину.С другой стороны, если опция width
не указана при создании сетки, один (как и вы, как вы хотите) расчет общей ширины сетки на основе суммы значений ширины всех столбцов.В случае, если ширина некоторого столбца будет изменена, ширина сетки также должна быть скорректирована (пересчитана).Проблема только в том, что исходная пустая опция width
будет перезаписана при создании сетки.Мое предложение было бы сохранить оригинальное значение опции width
в опции widthOrg
во время создания сетки.Таким образом, можно будет проверить оригинальное значение параметра width
и выбрать наилучшее поведение изменения размера сетки после изменения размера столбца.
UPDATED :После некоторого обсуждения с вами в комментариях и отладки кода jqGrid, я надеюсь, что нашел решение, которое работает правильно, независимо от значения параметра shrinkToFit
.Решение состоит из изменения кода resizeStop
на следующий
resizeStop: function () {
var $grid = $(this.bDiv).find('>div:first>table.ui-jqgrid-btable:first'),
shrinkToFit = $grid.jqGrid('getGridParam', 'shrinkToFit');
$grid.jqGrid('setGridWidth', this.newWidth, shrinkToFit);
}
и изменения двух строк внутреннего showHideCol
метода jqGrid.Сначала меняется строка
cw = this.widthOrg? this.widthOrg: parseInt(this.width,10);
на
cw = this.widthOrg && $t.p.shrinkToFit ? this.widthOrg: parseInt(this.width,10);
и другая строка
$($t).jqGrid("setGridWidth",$t.p.shrinkToFit === true ? $t.p.tblwidth : $t.p.width );
to
$($t).jqGrid("setGridWidth", $t.p.tblwidth);
Вы можете получить модифицированную версию jqGrid здесь . В первом демо используется код с shrinkToFit: true
и , во втором демо используется тот же код, но без опции shrinkToFit: true
.
Я, хотя в следующемдень, как заставить это исправление работать также в случае использования фиксированной width
опции jqGrid во время создания и опубликует мое предложение на форуме trirand.
Если вы хотите использовать свернутую версию jqGrid, вы можетелибо свести его к минимуму, либо использовать оригинальную jqGrid свернутую версию и перезаписать только метод showHideCol
относительно $.jgrid.extend
.См. демоверсию .
ОБНОВЛЕНО : после изменения значения this
в более поздних версиях jqGrid следует изменить приведенный выше код обратного вызова resizeStop
нао следующем:
resizeStop: function () {
var $self = $(this),
shrinkToFit = $self.jqGrid("getGridParam", "shrinkToFit");
$self.jqGrid("setGridWidth", this.grid.newWidth, shrinkToFit);
}