81

Is there any way to resize a jqGrid when the browser window is resized? I have tried the method described here but that technique does not work in IE7.

Justin Ethier
  • 131,333
  • 52
  • 229
  • 284

12 Answers12

69

Been using this in production for some time now without any complaints (May take some tweaking to look right on your site.. for instance, subtracting the width of a sidebar, etc)

$(window).bind('resize', function() {
    $("#jqgrid").setGridWidth($(window).width());
}).trigger('resize');
Stephen Fuhry
  • 12,624
  • 6
  • 56
  • 55
  • Also very useful in this situation: The second parameter to setGridWidth is 'shrink'. http://stackoverflow.com/questions/7745009/in-jqgrid-is-it-possible-to-resize-columns-to-fit-the-table-width-original-wid – Jim Feb 22 '13 at 22:29
  • Stephen, did you see jmav's solution? This seems like the best one but I wanted to see how you contrasted it with this approach – IcedDante May 22 '15 at 14:16
53

As a follow-up:

The previous code shown in this post was eventually abandoned because it was unreliable. I am now using the following API function to resize the grid, as recommended by the jqGrid documentation:

jQuery("#targetGrid").setGridWidth(width);

To do the actual resizing, a function implementing the following logic is bound to the window's resize event:

  • Calculate the width of the grid using its parent's clientWidth and (if that is not available) its offsetWidth attribute.

  • Perform a sanity check to make sure width has changed more than x pixels (to work around some application-specific problems)

  • Finally, use setGridWidth() to change the grid's width

Here is example code to handle resizing:

jQuery(window).bind('resize', function() {

    // Get width of parent container
    var width = jQuery(targetContainer).attr('clientWidth');
    if (width == null || width < 1){
        // For IE, revert to offsetWidth if necessary
        width = jQuery(targetContainer).attr('offsetWidth');
    }
    width = width - 2; // Fudge factor to prevent horizontal scrollbars
    if (width > 0 &&
        // Only resize if new width exceeds a minimal threshold
        // Fixes IE issue with in-place resizing when mousing-over frame bars
        Math.abs(width - jQuery(targetGrid).width()) > 5)
    {
        jQuery(targetGrid).setGridWidth(width);
    }

}).trigger('resize');

And example markup:

<div id="grid_container">
    <table id="grid"></table>
    <div id="grid_pgr"></div>
</div>
Lee Taylor
  • 7,761
  • 16
  • 33
  • 49
Justin Ethier
  • 131,333
  • 52
  • 229
  • 284
  • 2
    If you need to support IE you might want to throttle the frequency of resizing via timers. – fforw Oct 15 '09 at 21:30
  • Care to elaborate? I had problems on IE when the resize event was called without the grid changing width, which led to strange behavior on the grid itself. That is why the code takes into account a threshold in step 2. – Justin Ethier Oct 16 '09 at 01:17
  • What if I want to change of the css for the add/edit form of jqgrid ? – Bhavik Ambani Aug 13 '12 at 05:55
36

Auto resize:

For jQgrid 3.5+

        if (grid = $('.ui-jqgrid-btable:visible')) {
            grid.each(function(index) {
                gridId = $(this).attr('id');
                gridParentWidth = $('#gbox_' + gridId).parent().width();
                $('#' + gridId).setGridWidth(gridParentWidth);
            });
        }

For jQgrid 3.4.x:

       if (typeof $('table.scroll').setGridWidth == 'function') {
            $('table.scroll').setGridWidth(100, true); //reset when grid is wider than container (div)
            if (gridObj) {

            } else {
                $('#contentBox_content .grid_bdiv:reallyvisible').each(function(index) {
                    grid = $(this).children('table.scroll');
                    gridParentWidth = $(this).parent().width() – origami.grid.gridFromRight;
                    grid.setGridWidth(gridParentWidth, true);
                });
            }
        }
jmav
  • 3,119
  • 4
  • 27
  • 27
  • Well, I can confirm that the 3.5+ version above works great with jqGrid 4.4.1 on IE9, but with FireFox 16 an 17, the table keeps growing slightly wider every time I adjust the browser width. – MattSlay Dec 18 '12 at 20:46
  • Maybe you have problems with borders, defined in css - I did. – jmav Dec 27 '12 at 01:16
  • You will probably want to pass true as the second param in your setGridWidth() call in recent versions of jqGrid. If you don't the columns in your table aren't resized when the table resizes. ie `$(this).setGridWidth(gridParentWidth, true);` – Josh Schumacher Feb 21 '13 at 03:14
8

this seems to be working nicely for me

$(window).bind('resize', function() {
    jQuery("#grid").setGridWidth($('#parentDiv').width()-30, true);
}).trigger('resize');
Darren Cato
  • 1,382
  • 16
  • 22
7

I'm using 960.gs for layout so my solution is as follows:

    $(window).bind(
        'resize',
        function() {
                    //  Grid ids we are using
            $("#demogr, #allergygr, #problemsgr, #diagnosesgr, #medicalhisgr").setGridWidth(
                    $(".grid_5").width());
            $("#clinteamgr, #procedgr").setGridWidth(
                    $(".grid_10").width());
        }).trigger('resize');
// Here we set a global options

jQuery.extend(jQuery.jgrid.defaults, {
    // altRows:true,
    autowidth : true,
    beforeSelectRow : function(rowid, e) { // disable row highlighting onclick
        return false;
    },
    datatype : "jsonstring",
    datastr : grdata,  //  JSON object generated by another function
    gridview : false,
    height : '100%',
    hoverrows : false,
    loadonce : true,
    sortable : false,
    jsonReader : {
        repeatitems : false
    }
});

// Demographics Grid

$("#demogr").jqGrid( {
    caption : "Demographics",
    colNames : [ 'Info', 'Data' ],
    colModel : [ {
        name : 'Info',
        width : "30%",
        sortable : false,
        jsonmap : 'ITEM'
    }, {
        name : 'Description',
        width : "70%",
        sortable : false,
        jsonmap : 'DESCRIPTION'
    } ],
    jsonReader : {
        root : "DEMOGRAPHICS",
        id : "DEMOID"
    }
});

// Other grids defined below...

Sultan Shakir
  • 724
  • 2
  • 11
  • 22
5

If you:

  • have shrinkToFit: false (mean fixed width columns)
  • have autowidth: true
  • don't care about fluid height
  • have horizontal scrollbar

You can make grid with fluid width with following styles:

.ui-jqgrid {
  max-width: 100% !important;
  width: auto !important;
}

.ui-jqgrid-view,
.ui-jqgrid-hdiv,
.ui-jqgrid-bdiv {
   width: auto !important;
}

Here is a demo

sad comrade
  • 1,341
  • 19
  • 21
4

Borrowing from the code at your link you could try something like this:

$(window).bind('resize', function() { 
    // resize the datagrid to fit the page properly:
    $('div.subject').children('div').each(function() {
        $(this).width('auto');
        $(this).find('table').width('100%');
    });
});

This way you're binding directly to the window.onresize event, which actually looks like what you want from your question.

If your grid is set to 100% width though it should automatically expand when its container expands, unless there are some intricacies to the plugin you're using that I don't know about.

Dave L
  • 1,636
  • 9
  • 10
  • Thanks for the tip! Turns out that I was calling the resize code from the GridComplete event - for whatever reason this does not work in IE. Anyway, I extracted out the resize code into a separate function and call it both in the resize function and after the grid is created. Thanks again! – Justin Ethier May 18 '09 at 01:02
  • This doesn't work when resizing a window in IE 8 I believe. It does when you refresh the page though. – SoftwareSavant Aug 26 '11 at 12:24
3

The main answer worked for me but made the app extremely unresponsive in IE, so I used a timer as suggested. Code looks something like this ($(#contentColumn) is the div that the JQGrid sits in):

  function resizeGrids() {
    var reportObjectsGrid = $("#ReportObjectsGrid");
    reportObjectsGrid.setGridWidth($("#contentColumn").width());
};

var resizeTimer;

$(window).bind('resize', function () {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(resizeGrids, 60);
});
Justin Ethier
  • 131,333
  • 52
  • 229
  • 284
woggles
  • 7,444
  • 12
  • 70
  • 130
  • It seems like it would be tricky to make the timer work properly. Can you please take a look at my updated answer and see if you still need the timer? – Justin Ethier Apr 05 '11 at 14:18
  • 1
    Just compared all 3 of them. Yours is definitely an improvement over Stephens solution but the resizing of the window is still quite jerky. With the timer the resizing is smooth until the event fires so it takes a bit of fiddling to get timing trigger duration right. The timer is a bit clumsy, but I think it gives the best results in the end. – woggles Apr 05 '11 at 15:07
  • edit: Stephens sln works fine on another page of mine...this page only started to struggle once I had added a bunch of other jQueryUI controls to it. – woggles Apr 05 '11 at 15:19
  • This is a very dumb question. But I am a complete NOOB at Jquery, so please very much forgiving, but where are we placing all these functions? Inside the Jquery(document).ready(function() {} or are we sticking it out? Just wondering, also, where is $(window) and width coming from? – SoftwareSavant Aug 26 '11 at 12:10
  • @DmainEvent, I put the $(window).bind in $(Document).ready, and the reszieTimer var and resizeGrids function outside the $(Document).ready. $(window) is the window element that is built into jquery and .width() is a jquery function that calculates the width of an element – woggles Aug 26 '11 at 13:27
  • What if I want to change of the css for the add/edit form of jqgrid ? – Bhavik Ambani Aug 13 '12 at 05:57
3

Hello Stack overflow enthusiasts. I enjoyed most of answers, and I even up-voted a couple, but none of them worked for me on IE 8 for some strange reason... I did however run into these links... This guy wrote a library that seems to work. Include it in your projects in adittion to jquery UI, throw in the name of your table and the div.

http://stevenharman.net/blog/archive/2009/08/21/creating-a-fluid-jquery-jqgrid.aspx

http://code.google.com/p/codeincubator/source/browse/#svn%2FSamples%2Fsteveharman%2FjQuery%2Fjquery.jqgrid.fluid%253Fstate%253Dclosed

Justin Ethier
  • 131,333
  • 52
  • 229
  • 284
SoftwareSavant
  • 9,467
  • 27
  • 121
  • 195
  • I'm also getting some strange behaviour in IE8 with and without compatability view :/ My grid is resizing to half the size it should be...thanks for the links – woggles Jan 06 '12 at 07:48
1

This works..

var $targetGrid = $("#myGridId");
$(window).resize(function () {
    var jqGridWrapperId = "#gbox_" + $targetGrid.attr('id') //here be dragons, this is     generated by jqGrid.
    $targetGrid.setGridWidth($(jqGridWrapperId).parent().width()); //perhaps add padding calculation here?
});
Erik
  • 870
  • 7
  • 8
1
autowidth: true

worked perfectly for me. learnt from here.

Community
  • 1
  • 1
understack
  • 11,212
  • 24
  • 77
  • 100
  • 2
    `autowidth` works fine when the grid is first loaded, but will not resize the grid when the browser is resized. How did you deal with that problem, or is that not a requirement for you? – Justin Ethier Dec 04 '10 at 17:41
  • @Justin Ethier: you're right. I wanted it to set when grid is first time loaded, not when browser is resized. Sorry I misread the question. I understand down vote. – understack Dec 13 '10 at 18:08
0
<script>
$(document).ready(function(){    
$(window).on('resize', function() {
    jQuery("#grid").setGridWidth($('#fill').width(), false); 
    jQuery("#grid").setGridHeight($('#fill').height(),true); 
}).trigger('resize');      
});
</script>