I am new in jqGrid and I need that grid will be resized on resizing the window of the web browser. I have applied autowidth : true;
, shrinkToFit: true;
jqGrid uses fixed width
value on many internal structures (divs, tables and so on). So one can't just set CSS width : 100%
. Nevertheless there are another way to do the same. One can register resize
event handler on window
object and to call setGridWidth
explicitly. The method adjust all internals structures of jqGrid to new width. So it would be clean method.
If you use autowidth: true
then jqGrid set the width of jqGrid to the width of it's parent only once. Inside of $(window).resize
handler we can get new (the current) width of the parent and reset the value of grid width
. The corresponding code will be the following
$(window).on("resize", function () {
var $grid = $("#list"),
newWidth = $grid.closest(".ui-jqgrid").parent().width();
$grid.jqGrid("setGridWidth", newWidth, true);
});
I used $("#list").closest(".ui-jqgrid")
instead of $("#list")
because jqGrid build some dives over the main <table>
element. $("#list").closest(".ui-jqgrid")
gives as the outer div which include all the elements of the grid.
The modified fiddle demo demonstrates the code live.
Add to method below to beforeEvent of jqgrid......
function responsive_jqgrid(jqgrid) {
jqgrid.find('.ui-jqgrid').addClass('clear-margin span12').css('width', '');
jqgrid.find('.ui-jqgrid-view').addClass('clear-margin span12').css('width', '');
jqgrid.find('.ui-jqgrid-view > div').eq(1).addClass('clear-margin span12').css('width', '').css('min-height', '0');
jqgrid.find('.ui-jqgrid-view > div').eq(2).addClass('clear-margin span12').css('width', '').css('min-height', '0');
jqgrid.find('.ui-jqgrid-sdiv').addClass('clear-margin span12').css('width', '');
jqgrid.find('.ui-jqgrid-pager').addClass('clear-margin span12').css('width', '');
}
I tried the following code but observed that it did not provide any scroller for responsive devices. Hence decided to customise the JQGRID stylesheet:
$(window).on("resize", function () {
var $grid = $("#list"),
newWidth = $grid.closest(".ui-jqgrid").parent().width();
$grid.jqGrid("setGridWidth", newWidth, true);
});
Please find my hack for making JQ Grid properly responsive
/**** JQ grid responsiveness ***/
#gview_jqgrid, div#myPager {width:100% !important;height:100% !important;}
.ui-jqgrid-hdiv, .ui-jqgrid-htable {width:100% !important;height:100% !important;}
.ui-jqgrid-bdiv, #jqgrid {width:100% !important;height:100% !important;}
.ui-jqgrid .ui-jqgrid-hbox {padding-right:0 !important;}
.ui-jqgrid tr.jqgrow td { white-space: pre-wrap !important;}
div#gbox_jqgrid { width: 100% !important; overflow-x: scroll; margin-bottom: 80px !important;}
Add this to the custom stylesheet & get set to view the JQGrid fully responsive!
Any other suggestions will be most welcomed. Try it out & Enjoy!
I wrote a css you can use to make grid responsive: https://github.com/guylando/Responsive-jqGrid/blob/master/Responsive-jqGrid.css
Its faster than using javascript in my opinion.
Here is the css code:
.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control, .ui-jqgrid .ui-jqgrid-pager .ui-pager-control {
height: auto;
}
.ui-jqgrid .ui-pager-control td[id$="_toppager_center"], .ui-jqgrid .ui-pager-control td[id$="pager_center"] {
width: auto !important;
white-space: normal !important;
height: auto;
}
.ui-jqgrid .ui-pager-control td[id$="_toppager_left"], .ui-jqgrid .ui-pager-control td[id$="pager_left"] {
width: auto !important;
white-space: normal !important;
height: auto;
}
.ui-jqgrid .ui-pager-control td[id$="_toppager_right"], .ui-jqgrid .ui-pager-control td[id$="pager_right"] {
width: auto !important;
white-space: normal !important;
height: auto;
}
.ui-jqgrid .ui-jqgrid-bdiv, .ui-jqgrid .ui-jqgrid-view.table-responsive, .ui-jqgrid, .ui-jqgrid-pager,
.ui-jqgrid-toppager, .ui-jqgrid-hdiv {
width: auto !important;
}
.ui-jqgrid .ui-pager-control td[id$="_toppager_left"], .ui-jqgrid .ui-pager-control td[id$="pager_left"],
.ui-jqgrid .ui-pager-control td[id$="_toppager_center"], .ui-jqgrid .ui-pager-control td[id$="pager_center"] {
overflow-x: auto;
overflow-y: hidden;
}