How to get Data Row Selected in jqGrid

10,138

First of all I answer on your main question. The problem is that you get selrow parameter (the id of selected row) inside of beforeSelectRow callback. At the first click on 'details' button no row is selected. So myGrid.jqGrid('getGridParam', 'selrow') will return null and you will be unable to use getCell to get values from 'IN_CUSTOMS' and 'OUT_CUSTOMS' column of the row with id=null.

You always return true from beforeSelectRow callback. So you don't want to prevent row selection if the user click on the 'details' button. In the case I would recommend you better to use onCellSelect callback. By the way the callback has iCol (the index of the cell which was clicked) as additional parameter. It will additional simplify your code.

Next remark. You use sortable: true in all column, but the default value of sortable property is already true (see the documentation). Additional I would recommend you to use column templates in the definition of jqGrid. For example in the definition of the first grid you use multiple times the same properties to define hidden column with the checkbox. Additionally there are many columns having width: 100 and all columns have empty column header ''. So you can define the first grid as

var grid = $('#list'),
    hiddenCheckboxTemplate = { width: 30, editable: false,
        edittype: 'checkbox', editoptions: { value: "True:False" },
        formatter: "checkbox", formatoptions: { disabled: false }, hidden: true
    };
grid.jqGrid({
    colModel: [
        { name: 'REQUEST_ID', hidden: true },
        { name: 'REQUEST_DATE', width: 50 },
        { name: 'REQUEST_NO', width: 60 },
        { name: 'CUSTOMER_ID' },
        { name: 'TRANSPORT_TYPE', width: 40 },
        { name: 'CLEARANCE_TYPE', width: 50 },
        { name: 'IMPORT_EXPORT', template: hiddenCheckboxTemplate },
        { name: 'WAYBILL_NO', width: 50 },
        { name: 'WAYBILL_OFFICE' },
        { name: 'MANIFEST', width: 200, hidden: true },
        { name: 'STORE_BILL', hidden: true },
        { name: 'DIRECT_NO', hidden: true },
        { name: 'STORE_DATE', hidden: true },
        { name: 'INOUT_DATE', width: 50, hidden: true },
        { name: 'SOURCE_COUNTRY', width: 30, hidden: true },
        { name: 'SOURCE_CITY', width: 80, hidden: true },
        { name: 'DESTINATION_COUNTRY', hidden: true },
        { name: 'IN_CUSTOMS', width: 200, hidden: true },
        { name: 'OUT_CUSTOMS', hidden: true },
        { name: 'INSURER_ID', hidden: true },
        { name: 'INSURANCE_NO', hidden: true },
        { name: 'CLEARANCE_PERSON', width: 50, hidden: true },
        { name: 'PROXY_NO', width: 30, hidden: true },
        { name: 'FACTOR_NO', width: 80, hidden: true },
        { name: 'SHIP_NAME', hidden: true },
        { name: 'TRAVEL_NO', width: 200, hidden: true },
        { name: 'INDENT_NO', hidden: true },
        { name: 'COOTAG_NO', hidden: true },
        { name: 'PERMIT_NO', hidden: true },
        { name: 'CLEARANCE_NO', width: 50, hidden: true },
        { name: 'CARNETIR_NO', width: 30, hidden: true },
        { name: 'PURCHASE_TYPE', width: 80, hidden: true },
        { name: 'ALL_VALUE', hidden: true },
        { name: 'FREIGHT_STATUS', template: hiddenCheckboxTemplate },
        { name: 'COPY_ORIGINAL', template: hiddenCheckboxTemplate },
        { name: 'REMARK', hidden: true },
        { name: 'details', width: 20, sortable: false, search: false,
            formatter: function () {
                return "<span class='ui-icon ui-icon-document'></span>";
            }
        }
    ],
    cmTemplate: { width: 100, label: '' },
    ... other option. No colNames are needed because of usage label
});

In the way you reduce the code and make it more manageable (easy to maintain). Because of usage label property in colModel no colNames option should be included.

In the same way you can reduce the code which define the second grid too.

Another remark. the code if ($.jgrid.getCellIndex(e.target) == 37) { is difficult to understand and to maintain. If you would include additional column in the grid or if you even change the value of some option (like rownumbers) the constant 37 should be changed. What you want to do is just test whether the user clicked on the 'details' column. I would recommend you to use better the column names. For example

var colModel = $(this).jqGrid('getGridParam', 'colModel'),
    cm = colModel[iCol]; // iCol is defined before as $.jgrid.getCellIndex(e.target)
if (cm && cm.name === 'details') {
    ....
}

The last remark. You use GridUnload and then recreate the second grid with details. It would be more effective to use .trigger('reloadGrid', [{page: 1}]) instead (see here). At the beginning you can create the second grid with datatype: 'local'. It will prevent the loading of data from the server. You can place the second grid in div which you hide directly after the grid is created and show the div if needed. If the second grid need be filled with information you can use setGridParam to change datatype to 'json' (see the answer), set other parameters like requestId of postData and then call .trigger('reloadGrid', [{page: 1}]). The way will work more effectively.

Share:
10,138
Pouya
Author by

Pouya

Updated on June 13, 2022

Comments

  • Pouya
    Pouya almost 2 years

    i'm starter in jqGrid, i have 2 jqGrid in the page , in the Grid1 i have inCustom and OutCustom i want user click in Grid get Data inCustom and outCustom in write this code

    var grid = $('#list');
    grid.jqGrid({
        url: 'jQGridHandler.ashx',
        postData: { ActionPage: 'ClearanceRequest', Action: 'Fill' },
        ajaxGridOptions: { cache: false },
        loadonce: true,
        direction: "rtl",
        datatype: 'json',
        height: 600,
        width: 1000,
        colNames: ['', '', '', ' ', '', '', '', '', '',
                   '', '', ' ', '', '', '', '', '', '',
                   '', ' ', '', '', '', '',
                   '', '', '', '', '', '', ' ',
                   '', '', '', '', '', ''],
        colModel: [
            { name: 'REQUEST_ID', width: 100, sortable: true, hidden: true },
            { name: 'REQUEST_DATE', width: 50, sortable: true },
            { name: 'REQUEST_NO', width: 60, sortable: true },
            { name: 'CUSTOMER_ID', width: 100, sortable: true },
            { name: 'TRANSPORT_TYPE', width: 40, sortable: true },
            { name: 'CLEARANCE_TYPE', width: 50, sortable: true },
            { name: 'IMPORT_EXPORT', width: 30, sortable: true, editable: false,
                edittype: 'checkbox', editoptions: { value: "True:False" },
                formatter: "checkbox", formatoptions: { disabled: false }, hidden: true
            },
            { name: 'WAYBILL_NO', width: 50, sortable: true },
            { name: 'WAYBILL_OFFICE', width: 100, sortable: true },
            { name: 'MANIFEST', width: 200, sortable: true, hidden: true },
            { name: 'STORE_BILL', width: 100, sortable: true, hidden: true },
            { name: 'DIRECT_NO', width: 100, sortable: true, hidden: true },
            { name: 'STORE_DATE', width: 100, sortable: true, hidden: true },
            { name: 'INOUT_DATE', width: 50, sortable: true, hidden: true },
            { name: 'SOURCE_COUNTRY', width: 30, sortable: true, hidden: true },
            { name: 'SOURCE_CITY', width: 80, sortable: true, hidden: true },
            { name: 'DESTINATION_COUNTRY', width: 100, sortable: true, hidden: true },
            { name: 'IN_CUSTOMS', width: 200, sortable: true, hidden: true },
            { name: 'OUT_CUSTOMS', width: 100, sortable: true, hidden: true },
            { name: 'INSURER_ID', width: 100, sortable: true, hidden: true },
            { name: 'INSURANCE_NO', width: 100, sortable: true, hidden: true },
            { name: 'CLEARANCE_PERSON', width: 50, sortable: true, hidden: true },
            { name: 'PROXY_NO', width: 30, sortable: true, hidden: true },
            { name: 'FACTOR_NO', width: 80, sortable: true, hidden: true },
            { name: 'SHIP_NAME', width: 100, sortable: true, hidden: true },
            { name: 'TRAVEL_NO', width: 200, sortable: true, hidden: true },
            { name: 'INDENT_NO', width: 100, sortable: true, hidden: true },
            { name: 'COOTAG_NO', width: 100, sortable: true, hidden: true },
            { name: 'PERMIT_NO', width: 100, sortable: true, hidden: true },
            { name: 'CLEARANCE_NO', width: 50, sortable: true, hidden: true },
            { name: 'CARNETIR_NO', width: 30, sortable: true, hidden: true },
            { name: 'PURCHASE_TYPE', width: 80, sortable: true, hidden: true },
            { name: 'ALL_VALUE', width: 100, sortable: true, hidden: true },
            { name: 'FREIGHT_STATUS', width: 30, sortable: true, editable: false,
                edittype: 'checkbox', editoptions: { value: "True:False" },
                formatter: "checkbox", formatoptions: { disabled: false }, hidden: true
            },
            { name: 'COPY_ORIGINAL', width: 30, sortable: true, editable: false,
                edittype: 'checkbox', editoptions: { value: "True:False" },
                formatter: "checkbox", formatoptions: { disabled: false }, hidden: true
            },
            { name: 'REMARK', width: 100, sortable: true, hidden: true },
            { name: 'details', width: 20, sortable: false, search: false,
                formatter: function () {
                    return "<span class='ui-icon ui-icon-document'></span>";
                }
            }
        ],
        gridview: true,
        rowNum: 30,
        rowList: [30, 60, 90],
        pager: '#pager',
        sortname: 'WorkOrderNo',
        viewrecords: true,
        sortorder: 'ASC',
        rownumbers: true,
        beforeSelectRow: function (rowid, e) {
            var iCol = $.jgrid.getCellIndex(e.target);
            // alert(rowid);
            console.log(rowid);
            //listItem
            console.log($.jgrid.getCellIndex(e.target));
            if ($.jgrid.getCellIndex(e.target) == 37) {
                $("#listItem").jqGrid("GridUnload");
                var gridItem = $('#listItem');
                gridItem.jqGrid({
                    url: 'jQGridHandler.ashx',
                    postData: { ActionPage: 'ClearanceItems', Action: 'Fill', requestId: rowid },
                    ajaxGridOptions: { cache: false },
                    loadonce: true,
                    direction: "rtl",
                    datatype: 'json',
                    height: 200,
                    colNames: ['', '', '', '', ' ', ' ', '',
                               '', '', 'ا', ' ', '', ' ',
                               '', '', ' ', '  ',
                               '', '', '', ' ', '  ', ' ', ' ', ''],
                    colModel: [
                        { name: 'REQUEST_ID', width: 100, sortable: true },
                        { name: 'ITEM_NO', width: 200, sortable: true },
                        { name: 'GOODS_DESCRIPTION', width: 100, sortable: true },
                        { name: 'QUANTITY', width: 100, sortable: true },
                        { name: 'PACKING_TYPE', width: 100, sortable: true },
                        { name: 'GROSS_WEIGHT', width: 50, sortable: true },
                        { name: 'TARE_WEIGHT', width: 30, sortable: true },
                        { name: 'MEASUREMENT_TYPE', width: 80, sortable: true, hidden: true },
                        { name: 'GOODS_PRICE', width: 100, sortable: true, hidden: true },
                        { name: 'GOODS_CURRENCY', width: 200, sortable: true, hidden: true },
                        { name: 'GOODS_CURRENCY_RATE', width: 100, sortable: true, hidden: true },
                        { name: 'FREIGHT_PRICE', width: 100, sortable: true, hidden: true },
                        { name: 'FREIGHT_CURRENCY', width: 100, sortable: true, hidden: true },
                        { name: 'FREIGHT_CURRENCY_RATE', width: 50, sortable: true, hidden: true },
                        { name: 'INSURANCE_PRICE', width: 30, sortable: true, hidden: true },
                        { name: 'INSURANCE_CURRENCY', width: 80, sortable: true, hidden: true },
                        { name: 'INSURANCE_CURRENCY_RATE', width: 100, sortable: true, hidden: true },
                        { name: 'TARIFF_NO', width: 200, sortable: true, hidden: true },
                        { name: 'CUSTOM_PRICE', width: 100, sortable: true, hidden: true },
                        { name: 'WARRANTY_PRICE', width: 100, sortable: true, hidden: true },
                        { name: 'INOUT_DATE', width: 100, sortable: true, hidden: true },
                        { name: 'VEHICLE_TYPE', width: 50, sortable: true, hidden: true },
                        { name: 'VEHICLE_NO', width: 30, sortable: true, hidden: true },
                        { name: 'WAREHOUSE_ID', width: 80, sortable: true, hidden: true },
                        { name: 'REMARK', width: 80, sortable: true, hidden: true }
                    ],
                    gridview: true,
                    rowNum: 20,
                    rowList: [20, 40, 60],
                    pager: '#pagerItem',
                    viewrecords: true,
                    sortorder: 'ASC',
                    rownumbers: true
                });
                gridItem.jqGrid('navGrid', '#pagerItem', { add: true, edit: true, del: true },
                    {}, {}, {}, { multipleSearch: true, overlay: false, width: 460 });
    
                var myGrid = grid;
                var selRowId = myGrid.jqGrid('getGridParam', 'selrow');
                celValue = myGrid.jqGrid('getCell', selRowId, 'IN_CUSTOMS');
                celValue2 = myGrid.jqGrid('getCell', selRowId, 'OUT_CUSTOMS');
    
                console.log(celValue);
    
                console.log(celValue2);
    
                alert(celValue);
                alert(celValue2);
    
                $("#POPUP2").dialog({ width: 780 });
            }
    
            return true;
        }
    });
    grid.jqGrid('navGrid', '#pager', { add: false, edit: false, del: true },
        {}, {}, {}, { multipleSearch: true, overlay: false, width: 460 })
             .navButtonAdd("#pager", {
                 caption: "",
                 buttonicon: "ui-icon-plus",
                 onClickButton: function () {
                     // alert("Adding Row");
                     $("#POPUP1").dialog({ width: 730 });
                 },
                 position: "first"
    
             })
             .navButtonAdd("#pager", {
                 caption: "",
                 buttonicon: "ui-icon ui-icon-pencil",
                 onClickButton: function () {
    
                 },
                 position: "first"
    
             })
              .navButtonAdd("#pager", {
                  caption: "",
                  buttonicon: "ui-icon ui-icon-trash",
                  onClickButton: function () {
    
                  },
                  position: "first"
              });
    

    When first click in detils button get false value but after then return correct data enter image description here

    thanks all

  • Pouya
    Pouya about 12 years
    @ Oleg: thanks for help me, i trace code and first when user click in details coulmn selRowId value is null but i select row but in second time in user clicked selRowId get Correct data , just in first time return inCorrect data. please help me. thanks.
  • Oleg
    Oleg about 12 years
    @MohsenBahrzadeh: In the first sentence of my answer I wrote that it's because you use beforeSelectRow callback which will be called before the row is selected. The most simple way to fix this the problem is to use onSelectRow: function (id, state, e) {...} instead of beforeSelectRow: function (rowid, e) {...}