7

我有一个 jQueryUI 对话框 ( #locDialog),其中有一个 jqGrid ( $grid)。当对话框打开时(最初,但每当它打开时都会被调用),我希望$grid$locDialog. 当我最初这样做时,我在网格内(而不是在对话框内)得到滚动条。

如果我调试代码,我看到的宽度$grid是 677。所以,我setGridWidth()再次调用并检查宽度,现在我有 659,减少了 18px,这是 jqGrid 滚动区域的大小(Dun-dun -逼债..)

当我重新调整对话框时,我也调整了网格的大小,一切都很愉快 - 没有滚动条,除非必要。

我的对话框初始化代码:

$locDialog = $('#location-dialog').dialog({
    autoOpen: false,
    modal: true,
    position: ['center', 100],
    width: 700,
    height:500,
    resizable: true,
    buttons: {
                "Show Selected": function() {alert($('#grid').jqGrid('getGridParam','selarrrow'));},
                "OK": function() {$(this).dialog('close');},
                "Cancel": function() {$(this).dialog('close');}
             },
    open: function(event, ui) {
        $grid.setGridHeight($(this).height()-54); 
          // No idea why 54 is the magic number here
        $grid.setGridWidth($(this).width(), true);
    },
    close: function(event, ui) {

    },
    resizeStop: function(event, ui) {
        $grid.setGridWidth($locDialog.width(), true);
        $grid.setGridHeight($locDialog.height()-54);
    }
});

我很好奇是否有人以前见过这个。真的,如果我一开始有不必要的滚动条,这并不是世界末日,但奇怪的是,当我最初调用 setGridWidth 时,它没有考虑 18px 的滚动区域。

至于神奇的数字 54,这是我必须从对话框值的高度中减去的数字,以便在没有不必要的滚动条的情况下渲染网格。


我认为这可能是一个时间问题,尽管这没有多大意义。一旦网格完全加载,也许我应该调用一个事件。这可以确保它正确计算其宽度。

4

1 回答 1

15

在某些情况下,jqGrid 计算的宽度有点不正确。大多数情况下我对网格宽度有问题,但在某些情况下在 IE6 上也有高度问题。所以我必须写一个小函数来解决这个问题。

var fixGridWidth = function (grid) {
    var gviewScrollWidth = grid[0].parentNode.parentNode.parentNode.scrollWidth;
    var mainWidth = jQuery('#main').width();
    var gridScrollWidth = grid[0].scrollWidth;
    var htable = jQuery('table.ui-jqgrid-htable', grid[0].parentNode.parentNode.parentNode);
    var scrollWidth = gridScrollWidth;
    if (htable.length > 0) {
        var hdivScrollWidth = htable[0].scrollWidth;
        if ((gridScrollWidth < hdivScrollWidth))
            scrollWidth = hdivScrollWidth; // max (gridScrollWidth, hdivScrollWidth)
    }
    if (gviewScrollWidth != scrollWidth || scrollWidth > mainWidth) {
        var newGridWidth = (scrollWidth <= mainWidth)? scrollWidth: mainWidth;  // min (scrollWidth, mainWidth)
        // if the grid has no data, gridScrollWidth can be less then hdiv[0].scrollWidth
        if (newGridWidth != gviewScrollWidth)
            grid.jqGrid("setGridWidth", newGridWidth);
    }
};

var fixGridHeight = function (grid) {
    var gviewNode = grid[0].parentNode.parentNode.parentNode;
    //var gview = grid.parent().parent().parent();
    //var bdiv = jQuery("#gview_" + grid[0].id + " .ui-jqgrid-bdiv");
    var bdiv = jQuery(".ui-jqgrid-bdiv", gviewNode);
    if (bdiv.length) {
        var delta = bdiv[0].scrollHeight - bdiv[0].clientHeight;
        var height = grid.height();
        if (delta !== 0 && height && (height-delta>0)) {
            grid.setGridHeight(height-delta);
        }
    }
};

var fixGridSize = function (grid) {
    this.fixGridWidth(grid);
    this.fixGridHeight(grid);
};

在此代码"main"中是将在其中创建网格的父 div 的 id。在代码中我测试 ( scrollWidth > mainWidth) 的宽度是否"main"允许增加 jqGrid 的宽度。

调用此函数的正确位置在loadComplete

loadComplete: function() {
    var gr = jQuery('#list');
    fixGridSize(gr);
}

和里面"done",如果你使用'columnChooser'if 使用 useQuery('#list').jqGrid('columnChooser');

(在这个例子中,我也使用'gridResize'.)

于 2010-04-23T06:58:08.273 回答