jqGrid - checkbox editing not able to edit selected row

Dipen Shah

In my jqGrid, I have a checkbox which is also available for editing, i.e. a user can click on the checkbox and that checkbox's value will be updated in the database. That is working fine. However when I click on the checkbox and if I try clicking on it again, nothing happens. The row does not get saved. Theoretically the unchecked value of the checkbox should be saved. But this does not happen.

I have tried referring to this answer of Oleg but it does not help.

The weird problem is if I select another row and then try to unselect the checkbox again, I do see a save request going.

I am guessing this is because I am trying to edit a row which is currently selected. But I am not sure what I am doing wrong here.

This is what I am doing in my beforeSelectRow

beforeSelectRow: function (rowid, e) {
    var $target = $(e.target),
        $td = $target.closest("td"),
        iCol = $.jgrid.getCellIndex($td[0]),
        colModel = $(this).jqGrid("getGridParam", "colModel");
    if (iCol >= 0 && $target.is(":checkbox")) {
        if (colModel[iCol].name == "W3LabelSelected") {
            console.log(colModel[iCol].name);
            $(this).setSelection(rowid, true);
            $(this).jqGrid('resetSelection');
            $(this).jqGrid('saveRow', rowid, {
                succesfunc: function (response) {
                    $grid.trigger('reloadGrid');
                    return true;
                }
            });
        }
    }
    return true;
},

Configuration:

jqGrid version: Latest free jqGrid

Data Type: Json being saved to server

Minimal Grid Code: jsFiddle

EDIT: After Oleg's answer this is what I have so far:

beforeSelectRow: function (rowid, e) {
    var $self = $(this),
        iCol = $.jgrid.getCellIndex($(e.target).closest("td")[0]),
        cm = $self.jqGrid("getGridParam", "colModel");
    if (cm[iCol].name === "W3LabelSelected") {
        //console.log($(e.target).is(":checked"));
        $(this).jqGrid('saveRow', rowid, {
            succesfunc: function (response) {
                $grid.trigger('reloadGrid');
                return true;
            }
        });
    }

    return true; // allow selection
}

This is close to what I want. However if I select on the checkbox the first time and the second time, the console.log does get called everytime. However the saveRow gets called only when I check the checkbox and then click on it again to uncheck it the first time and never after that. By default the checkbox can be checked or unchecked based on data sent from server.

enter image description here

In the image, the request is sent after selecting the checkbox two times instead of being sent everytime.

UPDATE: As per @Oleg's suggestion, I have implemented cellattr and called a function inside. In the function I simply pass the rowid and update the checkbox of that rowid on the server.

Here's the code I used:

{
    name: 'W3LabelSelected',
    index: 'u.W3LabelSelected',
    align: 'center',
    width: '170',
    editable: false,
    edittype: 'checkbox',
    formatter: "checkbox",
    search: false,
    formatoptions: {
        disabled: false
    },
    editoptions: {
        value: "1:0"
    },
    cellattr: function (rowId, tv, rawObject, cm, rdata) {
        return ' onClick="selectThis(' + rowId + ')"';
    }
},

and my selectThis function:

function selectThis(rowid) {
    $.ajax({
        type: 'POST',
        url: myurl,
        data: {
            'id': rowid
        },
        success: function (data) {
            if (data.success == 'success') {
                $("#list").setGridParam({
                    datatype: 'json',
                    page: 1
                }).trigger('reloadGrid');
            } else {
                $("<div title='Error' class = 'ui-state-error ui-corner-all'>" + data.success + "</div>").dialog({});
            }
        }
    });
}

FIDDLE

Oleg

I think there is a misunderstanding in the usage of formatter: "checkbox", formatoptions: { disabled: false }. If you creates non-disabled checkboxs in the column of the grid in the way then the user just see the checkbox, which can be clicked and which state can be changed. On the other side nothing happens if the user changes the state of the checkbox. On the contrary the initial state of the checkbox corresponds to input data of the grid, but the changed checkbox makes illusion that the state is changed, but nothing will be done automatically. Even if you use datatype: "local" nothing is happens and even local data will be changed on click. If you do need to save the changes based on the changing the state of the checkbox then you have to implement additional code. The answer demonstrates a possible implementation. You can change the state of some checkboxes on the corresponding demo, then change the page and go back to the first page. You will see that the state of the checkbox corresponds the lates changes.

Now let us we try to start inline editing (start editRow) on select the row of the grid. First of all inline editing get the values from the rows (editable columns) using unformatter, saves the old values in internal savedRow parameter and then it creates new editing controls inside of editable cells on the place of old content. Everything is relatively easy in case of using standard disabled checkbox of formatter: "checkbox". jqGrid just creates enabled checkboxs on the place of disabled checkboxs. The user can change the state of the checkboxs or the content of any other editable columns and saves the changes by usage of Enter for example. After that the selected row will be saved and will be not more editable. You can monitor the changes of the state of the checkbox additionally (by usage editoptions.dataEvents with "change" event for example) and call saveRow on changing the state. It's important that the row will be not editable after the saving. If you do need to hold the row editable you will have to call editRow once more after successful saving of the row. You can call editRow inside of aftersavefunc callback of saveRow, but I recommend you to wrap the call of editRow inside of setTimeout to be sure that processing of previous saving is finished. It's the way which I would recommend you.

On the other side if you try to combine enabled checkboxs of formatter: "checkbox" with inline editing then you will have much more complex processing. It's important that enabled checkbox can be changed first of all before processing of onclick and onchange event handlers. The order of 3 events (changing the state of the checkbox, processing of onclick and processing of onchange) can be different in different web browsers. If the method editRow be executing it uses unformatter of checkbox-formatter to get the current state of the checkbox. Based of the value of the state editRow replace the content of the cell to another content with another enabled checkbox. It can be that the state of the checkbox is already changed, but editRow interprets the changes state like the initial state of the checkbox. In the same way one can call saveRow only after editRow. So you can't just use saveRow inside of change handler of formatter: "checkbox", formatoptions: { disabled: false }, because the line is not yet in editing mode.

UPDATED: The corresponding implementation (in case of usage formatter: "checkbox", formatoptions: { disabled: false }) could be the following:

editurl: "SomeUrl",
beforeSelectRow: function (rowid, e) {
    var $self = $(this),
        $td = $(e.target).closest("tr.jqgrow>td"),
        p = $self.jqGrid("getGridParam"),
        savedRow = p.savedRow,
        cm = $td.length > 0 ? p.colModel[$td[0].cellIndex] : null,
        cmName = cm != null && cm.editable ? cm.name : "Quantity",
        isChecked;
    if (savedRow.length > 0 && savedRow[0].id !== rowid) {
        $self.jqGrid("restoreRow", savedRow[0].id);
    }
    if (cm != null && cm.name === "W3LabelSelected" && $(e.target).is(":checkbox")) {
        if (savedRow.length > 0) {
            // some row is editing now
            isChecked = $(e.target).is(":checked");
            if (savedRow[0].id === rowid) {
                $self.jqGrid("saveRow", rowid, {
                    extraparam: {
                        W3LabelSelected: isChecked ? "1" : "0", 
                    },
                    aftersavefunc: function (response) {
                        $self.jqGrid("editRow", rowid, {
                            keys: true,
                            focusField: cmName
                        });
                    }
                });
            }
        } else {
            $.ajax({
                type: "POST",
                url: "SomeUrl", // probably just p.editurl
                data: $self.jqGrid("getRowData", rowid)
            });
        }
    }
    if (rowid) {
        $self.jqGrid("editRow", rowid, {
            keys: true,
            focusField: cmName
        });
    }

    return true; // allow selection
}

See jsfiddle demo http://jsfiddle.net/OlegKi/HJema/190/

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

jqGrid - checkbox editing not able to edit selected row

From Dev

Checkbox edit is not working in jqgrid

From Dev

jqGrid row selected but not highlighted

From Dev

jqGrid row selected but not highlighted

From Dev

jqGrid: How to add edit and delete button in every row with form editing enabled?

From Dev

Pass parameters in Edit Url of jqGrid for Form Editing

From Dev

Pass parameters in Edit Url of jqGrid for Form Editing

From Dev

jqgrid inline edit row validation

From Dev

Free jqGrid - Row not entering edit

From Dev

JqGrid check to see if the row is selected

From Dev

delete row if checkbox is selected

From Dev

delete row if checkbox is selected

From Dev

jqGrid: How to add a row in "cell editing" model?

From Dev

While editing a row , How does the cancel button will work and If I want to edit selected items at a time with edit button in AngularJS?

From Dev

jqGrid - Row Span in Add/Edit Modal

From Dev

jqGrid - Select selected cell's text while inline editing

From Dev

Check the checkbox = listviewitem row is selected

From Dev

jqGrid get multiple selected row cells value

From Dev

jqGrid get multiple selected row cells value

From Dev

How to get row ID by row Data in jqgrid (Not by selected row)

From Dev

Value of checkbox not set in edit form of jqGrid when using editoptions

From Dev

jqGrid, checkbox not aligned to left on edit form. Bootstrap

From Dev

How to set row id value after form editing in free jqgrid

From Dev

Not able to get selected row values from DataGrid

From Dev

Get selected Row in a pop up for Edit and Update

From Dev

customize jqGrid edit button inside row to open new view

From Dev

how to disable the automatic focus on jqGrid row when it is changed to edit mode

From Dev

All checkbox columns are not selected for row that is added to the dom

From Dev

How to find the index of selected row by checkbox in gridview?

Related Related

  1. 1

    jqGrid - checkbox editing not able to edit selected row

  2. 2

    Checkbox edit is not working in jqgrid

  3. 3

    jqGrid row selected but not highlighted

  4. 4

    jqGrid row selected but not highlighted

  5. 5

    jqGrid: How to add edit and delete button in every row with form editing enabled?

  6. 6

    Pass parameters in Edit Url of jqGrid for Form Editing

  7. 7

    Pass parameters in Edit Url of jqGrid for Form Editing

  8. 8

    jqgrid inline edit row validation

  9. 9

    Free jqGrid - Row not entering edit

  10. 10

    JqGrid check to see if the row is selected

  11. 11

    delete row if checkbox is selected

  12. 12

    delete row if checkbox is selected

  13. 13

    jqGrid: How to add a row in "cell editing" model?

  14. 14

    While editing a row , How does the cancel button will work and If I want to edit selected items at a time with edit button in AngularJS?

  15. 15

    jqGrid - Row Span in Add/Edit Modal

  16. 16

    jqGrid - Select selected cell's text while inline editing

  17. 17

    Check the checkbox = listviewitem row is selected

  18. 18

    jqGrid get multiple selected row cells value

  19. 19

    jqGrid get multiple selected row cells value

  20. 20

    How to get row ID by row Data in jqgrid (Not by selected row)

  21. 21

    Value of checkbox not set in edit form of jqGrid when using editoptions

  22. 22

    jqGrid, checkbox not aligned to left on edit form. Bootstrap

  23. 23

    How to set row id value after form editing in free jqgrid

  24. 24

    Not able to get selected row values from DataGrid

  25. 25

    Get selected Row in a pop up for Edit and Update

  26. 26

    customize jqGrid edit button inside row to open new view

  27. 27

    how to disable the automatic focus on jqGrid row when it is changed to edit mode

  28. 28

    All checkbox columns are not selected for row that is added to the dom

  29. 29

    How to find the index of selected row by checkbox in gridview?

HotTag

Archive