I am using kendo grid and the grid.And on a particular situation i am adding data to the datasource of the grid using grid.dataSource.add()
method.The following is the configuration of my grid.
var itemcodedataSource = new kendo.data.DataSource({
dataType: "json",
transport: {
read: function(o){
o.success([]);
},
create: function(o) {
var item = o.data;
//assign a unique ID and return the record
item.id = len;
o.success(item);
len++;
},
destroy: function(o) {
o.success();
},
update: function(o){
o.success();
}
},
autoSync: true,
schema: {
model: {
id : "id",
fields: {
type_flag: {validation: {}},
item_code:{validation:{}},
bill_no:{validation:{}},
item_code_desc: {validation: {},editable:false},
line_balance:{validation:{},type:"number",editable:false},
collection_status:{validation:{},editable:false},
amount:{validation:{required:false},type:"number",nullable:false },
item_detail:{},
total_balance:{type:"number",nullable:false},
total_due:{type:"number",nullable:false},
amt_edit_flag:{},
}
}
},
});
$("#itemcode_grid").kendoGrid({
dataSource: itemcodedataSource,
selectable: "multiple",
change : calcTotals,
toolbar: ["create"],
columns:[
{ field: "type_flag", width: "90px", title: "Type",sortable:false,
},
{ field: "item_code", width: "80px", title: "Item Code",sortable:false
},
{ field: "bill_no", width: "80px", title: "Bill Number",sortable:false
},
{ field: "line_balance", width: "50px", title: "Deferrals",sortable:false
},
{ field: "collection_status", width: "50px", title: "Hold",sortable:false
},
{ field: "amount", width: "70px", title: "Payment",sortable:false
},
{ command: ["edit", "destroy"], title: "Options", width: "130px"},
],
editable: "inline",
});
And i am adding the data to datasource by this way
var gridDs = $("#itemcode_grid").data("kendoGrid").dataSource;
for (var i = 0; i < gridData.length; i++) {
gridDs.add({
type_flag : gridData[i].type_flag,
item_code : gridData[i].item_code,
bill_no : detailsData[i].bill_no,
item_code_desc : detailsData[i].itemcode_details.item_code_desc,
line_balance : gridData[i].line_deferred,
collection_status : detailsData[i].collection_status,
amount : parseFloat(gridData[i].amount),
qty_pricing_type : detailsData[i].itemcode_details.qty_pricing_type,
item_detail : res[0][i],
total_balance : parseFloat(detailsData[i].line_balance),
total_due : detailsData[i].line_due,
id : gridDs._data.length+1,
});
gridDs.sync();
}
Where detailsData
and gridData
are the response of a ajax.What my problem is that this method adds new data to the grid.But while click on edit and cancel deletes the selected row from the grid.Usually this happens when the items in the grid does not have a unique id.But i checked and the items all have a unique id.Whats wrong with this code.How to solve this error.Thanks in advance.
Your record is being removed because the just added data is being destroyed when you cancel the edition.
Place a trace on
destroy
method and you will see it being invoked when you hitcancel
anddestroy
is being invoked because the have actually never been created into the server (place a trace oncreate
handler and you will see that it is not being invoked).And
create
is not being invoked because when you add them in thefor
loop you assign anid
.Try the
for
loop as follow:Conclusion: it is bad not assigning
id
but it is bad assigning it to early.