【问题标题】:Kendo - Grid - Remove Multiple Rows剑道 - 网格 - 删除多行
【发布时间】:2012-11-16 21:19:06
【问题描述】:

我有以下代码删除选中的行(每行都有一个复选框,我在工具栏中有一个过滤器按钮(和其他按钮)。

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

但是,当删除超过 20 行时,性能开始成为问题。但是,剑道过滤(删除)20 行或更多行的速度要快得多。剑道过滤如何从视图中删除多行?还是有其他更好的方法从网格中删除多行?提前感谢您的帮助。

【问题讨论】:

    标签: performance grid kendo-ui


    【解决方案1】:

    ** 将 Fiddle 更新到新位置 - 与之前相同的代码 **

    尝试直接处理数据。将复选框连接到行的 ID 并对其进行过滤。

    我链接了一个删除数组元素然后重新创建网格的小提琴。网格顶部的 2 个文本框捕获您要删除的 Id 范围(这将是您的 checkboxIds 的相同数组)。然后我循环浏览那些“删除 ID”,将它们从数据数组中删除并重新制作网格。

    我稍微修改了以前的小提琴,这就是我重新创建网格而不是直接处理 DataSource 对象的原因。但我希望你能明白我在做什么。

    在这个例子中我有 1000 条记录(只有 3 列),但它会很快删除 950 条记录。

    Fiddle- Remove from data array

    如果您需要 KendoUI DataSource 对象的示例,请告诉我。

    我在下面包含了这段代码,因为没有它 StackOverflow 不允许我发布。

    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();
    }
    

    【讨论】:

    • 非常感谢您的帮助!对于延迟回复,我深表歉意。我在网格中有很多列,重新创建网格太慢了。我只在页面加载期间创建一次。但是,您的回答为我指明了正确的方向。我只是按照您的建议更改数据存储数据,但刷新网格而不是重新创建。此外,网格中的对象很复杂,大约有 50 个道具。拼接太慢了(我猜是因为复杂的对象?)。相反,我只是创建了一个新的数据数组,只推送没有检查 id 的项目。再次感谢您的帮助。
    • 嗨,我已经试过你上面的代码了。但是当数据超过 70 行时,它会使浏览器变慢并显示无响应的脚本警告。有没有改善加载时间的解决方案..
    • 你能更新小提琴吗?我真的需要它。
    【解决方案2】:

    您应该使用批量更新:

    $("#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
    

    【讨论】:

    • 如果您使用批量更新,这绝对是您的最佳选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多