JQGrid: изменить размер сетки после изменения размера столбца - PullRequest
6 голосов
/ 07 марта 2012

Я бы хотел изменить ширину сетки после изменения размера столбца (чтобы ширина сетки соответствовала сумме ширины столбцов, включая новую ширину столбца с измененным размером). Это должно предотвратить появление горизонтальной полосы прокрутки.

Это похоже на этот вопрос , где в дополнение к изменению размера сетки после скрытия / отображения столбцов, я хотел бы изменить размер при расширении / сжатии столбцов:

Если вы посмотрите на демо в вопрос , предоставленный @Oleg, вы увидите, что сетка не изменяется при изменении размера столбца.

Существует событие resizeStop, которое я мог бы использовать, а затем использовать метод setGridWidth, чтобы установить для сетки ширину суммы ширин столбцов. Я не уверен, как суммировать ширину столбцов, хотя ... Может быть, есть что-то встроенное в JQGrid, которое я мог бы использовать, чтобы сделать это легко?

Большое спасибо за любые советы!

Ответы [ 2 ]

9 голосов
/ 07 марта 2012

Я лично нахожу вопрос очень хорошим.Я делаю много предложений, как улучшить алгоритм расчета ширины сетки.Дважды я включал в свои предложения поведение, которое вы хотите, но Тони (разработчик 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);
}
0 голосов
/ 15 августа 2013

Я делаю функцию

var grid_setAutoWidth = function() {

    var columnas = $(this).jqGrid('getGridParam', 'colModel');

    var anchoTotal = 0;
    for (var i = 0; columnas[i]; i++) {
        anchoTotal += columnas[i].width;
    }

    anchoTotal += 50;
    $(this).jqGrid('setGridWidth', anchoTotal);

};

... и затем в параметрах сетки

shrinkToFit: false,
loadComplete: grid_setAutoWidth,
resizeStop: grid_setAutoWidth,

Я думаю, что это самый простой способ

...