Как предотвратить отображение полосы прокрутки в jqGrid? - PullRequest
1 голос
/ 09 сентября 2010

Я использую jqGrid, и появляется горизонтальная полоса прокрутки. Как я могу предотвратить это?

jqGrid with scrollbar

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Иногда из-за разных проблем размер сетки будет неверно рассчитан, и у одной будет горизонтальная полоса прокрутки. Проблема в основном основана на

  • некоторые изменения в CSS, которые унаследованы от jqGrid без изменения параметра cellLayout в jqGrid
  • различная реализация наследования стилей CSS в разных браузерах
  • ошибки в алгоритме расчета ширины jqGrid. Размер сетки будет некорректно отрегулирован после заполнения сетки данными.

В моих проектах ASP.NET MVC в основном ширина столбцов сетки была на 5 пикселей меньше необходимой, и общая ширина сетки должна быть увеличена до 5 * colNumbers.

Проблемы с неправильной шириной сетки трудно отладить и исправить. Поэтому некоторое время назад я написал практический обходной путь, который я впервые предложил в своем ответе Правильный вызов setGridWidth для jqGrid в диалоге jQueryUI . Идея обходного решения заключается в сравнении размера сетки со свойством scrollWidth той части сетки, которая будет прокручиваться. Если полоса прокрутки существует и размер сетки меньше, чем размер элемента страницы, который содержит сетку, то мы просто увеличиваем ширину сетки и полоса прокрутки исчезает.

Например, у нас есть следующий фрагмент HTML с таблицей jqGrid

<div id="main">
<table id="grid"><tr><td/></tr></table>
<div id="pager"/>
</div>

тогда схема, как вы можете исправить проблему горизонтальной прокрутки, может быть следующей:

jQuery(document).ready(function () {
    var fixGridWidth = function (grid, mainBlockSelector) {
        // fix wrong width calculation 5 pixel per column
        //var gview = jQuery("#gview_" + grid[0].id); // like "#gview_grid"
        //var gview = grid.parent().parent().parent();
        var gviewDomElement = grid[0].parentNode.parentNode.parentNode;
        var gviewScrollWidth = gviewDomElement.scrollWidth;
        var mainWidth = jQuery(mainBlockSelector).width();
        var gridScrollWidth = grid[0].scrollWidth;
        var htable = jQuery('table.ui-jqgrid-htable', gviewDomElement);
        var scrollWidth = gridScrollWidth;
        if (htable.length > 0) {
            var hdivScrollWidth = htable[0].scrollWidth;
            if ((gridScrollWidth < hdivScrollWidth)) {
                // max (gridScrollWidth, hdivScrollWidth)
                scrollWidth = hdivScrollWidth;
            }
        }
        if (gviewScrollWidth != scrollWidth || scrollWidth > mainWidth) {
            // min (scrollWidth, mainWidth)
            var newGridWidth = (scrollWidth <= mainWidth)? scrollWidth: mainWidth;
            // if the grid has no data, gridScrollWidth can be less
            // then hdiv[0].scrollWidth
            if (newGridWidth != gviewScrollWidth) {
                grid.jqGrid("setGridWidth", newGridWidth);
            }
        }
    };

    var grid = jQuery("#grid");
    grid.jqGrid({
        // ... all like allways
        loadComplete: function(data) {
            // do all what you need and then at the end fix the wigth:
            fixGridWidth(grid,"#main");
        },
        // ... other jqGrid options
    };
});

В начале кода я использую структуру сетки, которая состоит из различных элементов div и таблиц поверх основной таблицы сетки с данными. Эту структуру вы можете увидеть с помощью инструментов разработчика IE8 или Chrome, Firebug других инструментов. Большую часть этой структуры я описываю в своих старых ответах на другие вопросы jqGrid и т. Д. Использование ячеек нижнего колонтитула Jquery и «наследует» CSS от ячеек в основной сетке .

Попробуйте использовать этот подход. Он не ищет причину проблемы с прокруткой, но, тем не менее, может решить большинство проблем с горизонтальной прокруткой.

0 голосов
/ 10 декабря 2011

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

loadComplete: function(data) {
   fixGridWidth($("#grid"));
}

function fixGridWidth(grid) {
    grid.setGridWidth($(window).width());
}
0 голосов
/ 16 апреля 2011

Если это все еще не работает и , если вы изменили css, попытайтесь

    'cellLayout' =>  21,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...