1

So my aim it to loop through all selected item in my kendo grid, but after the first iteration the dataItem method returns undefined.

function myFunction() {
var selectedItem = $("#DropDown").val();
var grid = $("#Grid").getKendoGrid();
var selectedItems = grid.select();
for (var i = 0; i < selectedItems.length; i++) {
    var dataItem = grid.dataItem(selectedItems[i]);
    if (dataItem != undefined)
        dataItem.set("Item", SelectedItem);
}
}

Does anyone know why this might be happening?

GeorgeB
  • 808
  • 1
  • 8
  • 26

1 Answers1

1

That happens because set() performs a grid refresh behind-the-scenes so the DOM is recreated. The array you had with the selected items is lost. You can't rely on the tr's references. As a suggestion I think you can use they indexes instead:

function myFunction() {
    var selectedItem = $("#DropDown").val();
    var grid = $("#Grid").getKendoGrid();
    var selectedItems = grid.select().toArray().map((item) => { return $(item).index(); });

    for (var i = 0; i < selectedItems.length; i++) {
        var currentItem = grid.tbody.find(`tr:eq(${selectedItems[i]})`);
        var dataItem = grid.dataItem(currentItem );
        if (dataItem != undefined)
            dataItem.set("Item", SelectedItem);
    }
}
  • var selectedItems = grid.select().toArray().map((item) => { return $(item).index(); });

    This line gets an array of indexes from the selected grid rows to iterate further ahead;

  • var currentItem = grid.tbody.find(`tr:eq(${selectedItems[i]})`);

    This line retrieves the selected row from by the index.

Demo

DontVoteMeDown
  • 21,122
  • 10
  • 69
  • 105
  • 1
    Your solution did work and was valid, however I used your explanation to solve it slightly differently. I created an array called dataItems and pushed each dataItem in it, then looped through that. I know this involves using more lines but I think its easier to see whats going on. – GeorgeB Jul 26 '18 at 07:43
  • 1
    @GeorgeB indeed can be even better than what I proposed! Well done! – DontVoteMeDown Jul 26 '18 at 13:06