Start Building Professional
Web Apps Today


 
Categories Question details Back To List
Question  posted by Ben on Apr 15, 2008 07:09
open dhtmlx forum
Delete a row in a grid

Hi,
I use the deleteSelectedRows function and it works fine, but in a case i want that the server sends an error for example (<?xml version="1.0" encoding="ISO-8859-1" ?><data><action type="error_undeletable">1</action></data>).
The problem is on next event the request is resend to the server, so it loops.
How the selected rows added to deleted rows array could be unselected so that the request is not send another time.

Thanks
Answer posted by Support on Apr 15, 2008 07:54
In your code, which process error response you need to add next line

    dataprocessor.setUpdated(row_id,false);

It will remove row from collection of updated rows.
Answer posted by Ben on Apr 15, 2008 08:26
this the code of my handler

myDataProcessor.defineAction("error_undeletable", undeletableHandler);

    function undeletableHandler(obj){
        var rowId = obj.firstChild.nodeValue - 1;
        alert("row id" + rowId);
        mygrid.selectRow(rowId, false, false, true);
        alert("Error occured.\nThis record cannot be deleted.");
        myDataProcessor.stopOnError = true;
        myDataProcessor.setUpdated(rowId,false);
        return false;
    }

and i got an error on line 1996 in dhtmlxgrid_debug.js
this.getRowById(row_id) -> null

so, where is my error ?
Answer posted by Support on Apr 15, 2008 08:37
Are you using native grid behavior, when deleted row just marked , or has modified code, so record deleted for sure ?
The mentioned error may occur only if row with specified ID not found in grid ( which must not occur in case of native behavior )

In any way, please try to replace problematic line with
    myDataProcessor.updatedRows[myDataProcessor.findRow(rowId)]=null;
It will work correctly even if row was deleted for sure.
Answer posted by Ben on Apr 15, 2008 08:49
the error in dhtmlxgrid_debug.js doesn't occur now.
But the request for deleting the row still be send to the server !!
the state of the row isn't delete.
Answer posted by Ben on Apr 16, 2008 01:39
Any solution ?
thanks
Answer posted by Support on Apr 16, 2008 02:52
If you deleting row from updatedRows array - it must not generate any calls to server.
You can try to add one more command to clear "delete" status of row

    function undeletableHandler(obj){
        var rowId = obj.firstChild.nodeValue - 1;
        alert("row id" + rowId);
        mygrid.selectRow(rowId, false, false, true);
        alert("Error occured.\nThis record cannot be deleted.");
        myDataProcessor.stopOnError = true;
        myDataProcessor.updatedRows[myDataProcessor.findRow(rowId)]=null;
        mygrid.setUserData(rowId,"!nativeeditor_status","")
        return false;
    }

Please be sure that rowID value returned from server is exactly the same as ID of row in grid.
Answer posted by Ben on Apr 16, 2008 03:00
There's no change. :(
I think my valueof rowid is correct, because the mygrid.selectRow(rowId, false, false, true); method select the right row in my grid.
but the myDataProcessor.findRow(rowId) method return -1.
Answer posted by Support on Apr 16, 2008 04:27
If myDataProcessor.findRow(rowId) returns -1 that means that row not marked as updated and its data must not be send to the server again.
You can check the content of
       myDataProcessor.updatedRows
this array, contains IDs of updated rows

If you have any kind of online sample where issue can be reconstructed please contact us directly at support@dhtmlx.com
Answer posted by Ben on Apr 16, 2008 05:26
myDataProcessor.updatedRows contains one id which is the id of the row selected for deleting
why myDataProcessor.findRow(rowId) return -1 ?

if i put myDataProcessor.updatedRows[0]=null; the request is not send again.
but i mus'nt have multi-selction in my grid.

in this case (not sending the request again), how can i put the row to the original style ?

i've got no sample online.
Answer posted by Ben on Apr 16, 2008 06:46
instead of using myDataProcessor.updatedRows[0]=null; i use myDataProcessor.updatedRows=new Array(0);
i've got not request send.
But there's another problem
i can't try to delete the row after, and more serious, if i change data in my row that the conditions of deletion is ok, the row is deleted.
So i understand nothing.

How i can put my grid in a standard state after an event (update/delete), so that there's no interaction like the last one ?
I wan't something like myDataprocessor.deleteAllDataToUpdateOrDelete

Thanks
Answer posted by Support on Apr 16, 2008 08:10

dataProcessor.prototype.deleteAllDataToUpdateOrDelete(){
    for (var i=0; i<this.updatedRows.length; i++)
       if (this.updatedRows[i])
          this.obj.setUserData(this.updatedRows[i],"!nativeeditor_status","");
    this.updatedRows[i] = new Array(0);
}
Answer posted by Ben on Apr 16, 2008 08:19
It was a sample for the method !!
there's no mecanism in dhtmlxgrid that can remove all events and data state. The goal is that my grid goes to a stable state like after a load.

Maybe what i made is not the right solution to achieve what i want ?
Answer posted by Support on Apr 16, 2008 09:20
>>there's no mecanism in dhtmlxgrid that can remove all events and data state.
There is no API command to such operation, but you can reinit grid if necessary, something similar to next

grid.setSerializationLevel(true,true,true);
var state = grid.serialize();   //get current state
grid.destructor();
grid = new dhtmlXGridObject('some')
grid.loadXMLString(state);

basically it destroys old grid and create new one with same data
Answer posted by Ben on Apr 17, 2008 00:35
i've already think of this solution but i loose pagination, filters and sorts, and i want to keep them.
is it possible to implement such a command in API ?
Answer posted by Support on Apr 17, 2008 02:29
There are a lot of possible options|modes so it pretty complex to fully restore grid's state to initial one.
If limit the set of properties which need to be restored - it can be done with some custom code, but restore ALL setting to initial ones is pretty complex task.
Answer posted by Ben on Apr 17, 2008 03:21
So ok, i'll put my control before the call of the deleteSelectedRows.
But i think you should have a mecanism which will restore the grid in a state identical of the state before an event is launched like a rollback in a database.