I was wondering whether there is a better way to load large Json data set from the server.
I am using jqgrid as loadonce:true. i need to load around 1500 records at once and also i don't use pagination options. is there any better way to achieve this? Thank you in advance.
This is my Grid code -
$(function(){
$("#testgrid").jqGrid({
url:getGridUrl,
datatype: 'json',
mtype: 'GET',
height: 250,
colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
colModel:[
{name:'id',index:'id', width:60, sorttype:"int",search:false},
{name:'invdate',index:'invdate', width:90, sorttype:"date",search:false},
{name:'name',index:'name', width:100,search:false},
{name:'amount',index:'amount', width:80, align:"right",sorttype:"float"},
{name:'tax',index:'tax', width:80, align:"right",sorttype:"float",search:false},
{name:'total',index:'total', width:80,align:"right",sorttype:"float",search:false},
{name:'note',index:'note', width:150, sortable:false,search:false}
],
multiselect: true,
multiboxonly:true,
caption: "Manipulating Array Data",
pager: '#testgridpager',
//Auto load while scrolling
//scroll: true,
//to hide pager buttons
pgbuttons:false,
recordtext:'',
pgtext:'',
loadonce: true,
sortname: 'id',
sortorder: 'asc',
viewrecords: true,
multiselect: true,
jsonReader : {
root: "rows",
//page: "page",
//total: "total",
records: "records",
repeatitems: false,
cell: "cell",
id: "id"
},
loadComplete: function(data) {
var rowId;
//alert(data.length);
//alert('load complete'+data.rows.length);
//set checkboxes false if mode is set to true
if(mode){
for(var i=0;i<data.rows.length;i++){
rowId=data.rows[i].id;
disableRow(rowId);
var searchVal = $("#gs_amount").val().trim();
if(searchVal ==data.rows[i].amount){
jQuery("#testgrid").jqGrid('setSelection',rowId);
//heighlightSearch();
}
}
}
}
});
//toolbar search
$("#testgrid").jqGrid('filterToolbar',{stringResult:true,searchOnEnter:false});
});
function disableRow(rowId){
$("#testgrid").jqGrid('setRowData', rowId, false, {color:'gray'});
var trElement = jQuery("#"+ rowId,$('#testgrid'));
trElement.removeClass("ui-state-hover");
trElement.addClass('ui-state-disabled');
trElement.attr("disabled",true);
}
gridview:true
parameter? – NessusdisableRow
? I am not sure that I understand what you do inside ofloadComplete
. If in the filter bar foramount
no data exist you should do nothing. If inamount
the data exist the data are filtered and you should select all rows. Is it so? Moreover I don't seegridview:true
parameter. Is the example which you posted the real example which you tested? How long time is the loading in your tests? Which browser is the most important for you? – Nessusgridview
param to check the consequences. inside loadComplete if theamount
match the grid valueamount
it needs to get selected. you are right i do need to put empty check in loadComplete. I am still searching the better ways to do this(load large data). IE 8 will be my most important browser. Thanks for your response Oleg. I will looking forward to your thoughts among this.Appreciate it. – ThrombokinaserowNum
with some value greater or equal to 1500. After this you will see that your grid is mostly slow because of the actions which you do inside ofloadComplete
. If you commented th part and usegridview: true
andhoverrows: false
the grid construction will be acceptable. What is unclear for me is the following: Your current code disable all rows (in many ways) and then try to select all the rows. What you really want to do? – Nessusmode
i need to disable the filtered rows.that rows cannot be selected. else i need to filter whatever value typed in theamount
search box must be filtered. i assume there may be a uniqueamount
for each and every row. so if theamount
match the particular amount in the grid that row needs to be automatically checked. thats what i am trying to do. if my approach is wrong please let me know what needs to be change. Thank you. – ThrombokinasesearchOnEnter:false
, then the grid start be filtered almost immediately after starting the typing in the "#gs_amount". So all rows which will be displayed in the grid are the filtered rows. So if you write "i need to disable the filtered rows" it means that all rows of grid will be disabled. I don't quite understand which matching you need. If you define searchoptions withsopt:["eq"]
for 'amount' column only exact matching will be done. – NessusdefaultSearch
parameter offilterToolbar
to specify the default matching operations. I use almost everywhere for the integer and 'select' columns the exact matching 'eq' and case insensitive (ignoreCase:true
parameter of jqGrid) contain searching ('cn') for the columns having strings. – Nessusrepeatitems:false
injsonReader
. If one column can be interpret as the id one can usecell:""
instead (see my answer). Much more important is how to work with the data. Simple loop where you find row by rowid is too slow. Moreover would recommend you to use local data paging. 1500 rows can not be displayed at once. If you will use local paging by setting rowNum to some small value the performance will be much much better. – Nessus