1
votes

I have the following code that remove rows that are checked (each row has a checkbox and I have a Filter button (and other buttons) in the toolbar).

var grid = $("#resultsGrid").data("kendoGrid");
grid.tbody.find("input:checked").closest("tr").each( function(index) {
    grid.removeRow($(this));
});

However, performance starts to become an issue when there are > 20 rows being removed. However, kendo filters (removes) 20 rows or more much faster. How is kendo filtering removing multiple rows from the view? Or is there some other better way to remove multiple rows from the grid? Thanks in advance for your help.

2

2 Answers

4
votes

** Updated Fiddle to new location - Same code as before **

Try dealing with the data directly. Have the checkbox hooked to the row's Id and filter on that.

I linked a fiddle that removes array elements and then re-creates the grid. The 2 text boxes at the top of the grid capture the range of Ids that you want to remove (this would be the same array of your checkboxIds). Then I cycled through those "remove Ids", removed them from the data array and remade the grid.

I slightly modified a previous fiddle and that's why I'm re-creating the grid instead of dealing with the DataSource object directly. But I hope you get the gist of what I'm doing.

I have 1000 records in this example (only 3 columns) but it removes 950 records very quickly.

Fiddle- Remove from data array

Let me know if you need an example of this with the KendoUI DataSource object.

I included this code below because StackOverflow wouldn't let me post without it.

function filterData() {

    var val1 = $("#val1").val();
    var val2 = $("#val2").val();

    var removeIndexes = new Array();

    for (var i = val1; i <= val2; i++) {
        removeIndexes.push(i);
    }    

    $(removeIndexes).each(function(removeIndex) {
        var removeItemId = this;
        $(randomData).each(function(dataIndex) {
            var continueLoop = true;
            if (this.Id == removeItemId) {
                randomData.splice(dataIndex, 1);
                continueLoop = false;
            }
            return continueLoop;
        });
    });

    createGrid();
}
1
votes

You should use batch updates:

$("#resultsGrid").kendoGrid({
    dataSource: {
        batch: true,
        ...
    }, ...});

var grid = $("#resultsGrid").data("kendoGrid");
grid.tbody.find("input:checked").closest("tr").each( function() {
    var dataItem = grid.dataItem(this);
    grid.dataSource.remove(dataItem);
});
grid.dataSource.sync(); // this applies batched changes