【问题标题】:Kendo grid change indicator and cancel not working剑道网格更改指示器和取消不起作用
【发布时间】:2025-11-22 06:50:02
【问题描述】:

我是剑道和剑道网格的新手,但我正在尝试学习如何使用主细节剑道网格,其中细节网格应该支持批量编辑。数据在本地 JavaScript 对象中可用。

This jsFiddle 演示了我看到的问题。

这是创建网格的方式- 请参阅 jsFiddle 了解完整的 sn-p -

$("#grid").kendoGrid({
    dataSource: items,
    detailInit: createDetail,
    columns: [
        { field: "Item", width: "200px" },
    ]
});

function createDetail(e) {
    $("<div/>")
        .appendTo(e.detailCell)
        .kendoGrid({
            dataSource: {
                batch:true,
                transport: {
                    read: function (options) {
                        options.success(e.data.SubItems);
                    }
                }
            },
            editable:true,
            pageable:true,
            toolbar: ["save", "cancel"],
            columns: [
                { field: "SubItem", title: "Sub Item", width: 200 },
                { field: "Heading1", title: "Heading 1", width: 100 }
            ]
        });
}
  1. 当您在网格中编辑项目并单击到下一个单元格时,无论我在哪里单击,详细信息网格都会自动折叠,即使在相邻的单元格中也是如此。当我再次打开它时,我在单元格中看不到更改指示器(红色缺口),但新值在那里。 如果我要将保存连接到 ajax 调用,Kendo 会发送正确的已编辑详细信息项。

  2. 当我单击取消更改时没有任何反应。

如何让网格不折叠并查看更改指示器?

如何取消更改才能正常工作?

[更新] - 进一步调查显示,如果我使用较旧的剑道版本 2011.3.1129 ,这将按预期工作。但如果我使用较新的 2012.3.1114,则不会。不知道这是错误还是行为变化。

【问题讨论】:

    标签: kendo-ui kendo-grid


    【解决方案1】:

    经过一番努力,我发现原因似乎是主网格自动重新绑定导致我观察到的行为。我能够通过处理主网格中的 dataBinding 事件并在其中检查是否有任何详细数据源是脏的,如果是,则调用 preventDefault。

    这里是相关代码sn-ps:

        dataBinding: function (e) {
                   if (masterGrid.AreChangesPending()) {
                       e.preventDefault();
                   } 
        }
    
        AreChangesPending : function () {
            var pendingChanges = false;
            // I gave each detail div an id so that I can get a "handle" to it 
            $('div[id^="detail_"]').each(function (index) {
                var dsrc = $(this).data("kendoGrid").dataSource;
                $.each(dsrc._data, function () {
                    if (this.dirty == true || this.isNew()) {
                        pendingChanges = true;
                    }
                });
    
                // For some reason, Kendo did not detect new rows in the isNew() 
                // call above, hence the check below
                if (dsrc._data.length != dsrc._total) {
                    pendingChanges = true;
                }
            });
    
            return pendingChanges;
        }
    

    【讨论】:

      最近更新 更多