savgoran
savgoran

Reputation: 53

jqGrid rowNum option issue

Assume that row numbers is changed from 10 to 30 in navgrid and that we handle onPaging like so:

...
onPaging: function(pgbtn) {
    var rowNum = $(this).getGridParam('rowNum');
    return 'stop';
}

Is this expected behaviour because I think rowNum should be 30?

Upvotes: 1

Views: 1020

Answers (2)

Ken
Ken

Reputation: 1

In the case of top and bottom pagers, I would add to Oleg's response:

onPaging: function (pgButton) {
    var p = $(this).jqGrid("getGridParam"),
        rowNumBottom = parseInt($(p.pager).find(".ui-pg-selbox").val()),
        rowNumTop = parseInt($(p.toppager).find(".ui-pg-selbox").val()),
        newRowNum = p.rowNum === rowNumTop ? rowNumBottom: rowNumTop;

    if (...) { // some stop criteria
        return "stop";
    }

    // update the current value so subsequent changes are detected
    p.rowNum = newRowNum;

}

This handles the case that the user changes the value on the top pager, then changes it again on the bottom pager. The code above will keep detecting the top pager value.

Upvotes: 0

Oleg
Oleg

Reputation: 221997

The order of the execution is changed in (compare the line in jqGrid 4.7.0 with the line in jqGrid 4.4.0). jqGrid first changed the rowNum``and then calledonPaging` in jqGrid 4.4.0, but in jqFeid 4.7.0 the oder is changed.

To access to the new value of rowNum one should get the value of rowNum from the corresponding <select> control directly. If you use the pager at the bottom of the grid then the corresponding code could be the following:

onPaging: function (pgButton) {
    var p = $(this).jqGrid("getGridParam"),
        newRowNum = parseInt($(p.pager).find(".ui-pg-selbox").val());

    if (...) { // some stop criteria
        return "stop";
    }
}

If you use toppager: true option then jqGrid create the pager on the top of the grid and then it change the value of toppager parameter from true to the selector id of the pager. So you can use the code like

onPaging: function (pgButton) {
    var p = $(this).jqGrid("getGridParam"),
        newRowNum = parseInt($(p.toppager).find(".ui-pg-selbox").val());

    if (...) { // some stop criteria
        return "stop";
    }
}

which just use p.toppager instead of p.pager in the previous code example.

In case of usage both top and bottom pagers you have to get both values and choose the value which is not equal to the value of rowNum parameter:

onPaging: function (pgButton) {
    var p = $(this).jqGrid("getGridParam"),
        rowNumBottom = parseInt($(p.pager).find(".ui-pg-selbox").val()),
        rowNumTop = parseInt($(p.toppager).find(".ui-pg-selbox").val()),
        newRowNum = p.rowNum === rowNumTop ? rowNumBottom: rowNumTop;

    if (...) { // some stop criteria
        return "stop";
    }
}

By the way there are exist close problem in case of calling onPaging after other changing in the pager, for example if the user typed new value in the input box with new pager number.

I'm developing now free jqGrid as my fork on github. I change the code of jqGrid so that onPaging receives the second parameter which is object with the properties newPage, currentPage, lastPage, currentRowNum and newRowNum. The corresponding jQuery event jqGridPaging are added too. Moreover I have changed the value of the first parameter so that it corresponds the documentation and the value will be the string "first", "last", "prev" or "next" in case when the user clicked on the corresponding pager button. The version 4.7 used in reality the id of the corresponding pager buttons instead of "first", "last", "prev", "next". So the strings "first", "last", "prev", "next" could be appended with "_" and the id of the pager (or toppager).

Thus one can just use options.newRowNum or options.currentRowNum directly in the code of callback:

onPaging: function (pgButton, options) {
    // one can use options.newRowNum directly
    // the value options.currentRowNum is identical to 
    // $(this).jqGrid("getGridParam", "rowNum")

    if (...) { // some stop criteria
        return "stop";
    }
}

Upvotes: 1

Related Questions