2

我有一个可编辑的剑道网格,它可能有一个带有复选框的列来更改布尔值。我已经使用了OnaBai提出的这个解决方案,效果很好!

唯一的问题是复选框值变化太慢。当用户点击它时,大约需要 1 秒的时间来改变。我意识到该dataItem.set()方法是由这种延迟负责的。

我的网格有大量数据。大约 30-40 列和 300 多行。定义如下:

$("#mainGrid").kendoGrid({
    dataSource: dataSource,

    pageable: false,
    sortable: true,

    scrollable: true,
    editable: true,
    autoBind: false,
    columnMenu: true, // Cria o menu de exibição de colunas
    height: getGridHeight(),

    toolbar: [/* hide for brevity */],
    columns: [/* hide for brevity */],
    dataBound: function() { /* hide for brevity. */},
    edit: function() { /* hide for brevity. */}
});

另一个细节是,当dataItem.set()被调用时,它会调用dataBound()事件,但这不会导致延迟。edit()在这个过程中没有调用Grid 的方法。我不知道是否值得发布dataSource代码。

4

4 回答 4

1

在使用复选框时,我建议使用此代码库文章中的方法。它不使用模型的 set 方法,并且仍然以相同的方式工作。即使单页上有 2000 条记录,CheckAll 也能完美运行。

于 2013-10-29T16:46:33.507 回答
0

我找到了另一种方法来做 OnaBai 提议的事情,而且效果更好。

// This is the grid
var grid = $("#mainGrid").data("kendoGrid");

// .flag is a class that is used on the checkboxes
grid.tbody.on("change", ".flag", function (e) 
{
    // Get the record uid
    var uid = grid.dataItem($(e.target).closest("tr")).uid;

    // Find the current cell
    var td = $(e.target).parent().parent();

    // This opens the cell to edit(edit mode)
    grid.editCell(td);

    // This ones changes the value of the Kendo's checkbox, that is quickly shown, 
    // changed and then hidden again. This marks the cell as 'dirty' too.
    $(td.find("input")[0]).prop("checked", $(e.target).is(":checked") ? "checked" : null).trigger("change").trigger("blur");
}
于 2013-11-05T11:28:13.383 回答
0

应该尝试这样的事情:

我将使用“编辑”按钮设置列,如下所示:

columns.Command(command => {command.Edit().HtmlAttributes(new { id = "btnEdit_" + "${Id}" }); }).Width(100).Hidden(true);

并在单击第一列的位置(我有一个带有超链接的图像)使用 onclick 函数以编程方式单击“编辑”按钮,单击复选框,然后单击“更新”按钮。可能更“老派”,但我喜欢知道它遵循我自己更新它时的顺序。

我传入对象(“t​​his”),所以当它出现时我可以获取行和复选框,新状态为 0 或 1(我有一些使用它的代码,不过对于这个演示来说并不是必需的,所以我'为了简单起见,我将那部分从我的函数中删除),以及该项目的 ID:

columns.Bound(p => p.IsActive).Title("Active").Width(100).ClientTemplate("# if (IsActive == true ) {# <a href=javascript:void(0) id=btnActive_${Id} onclick=changeCheckbox(this, '0', ${Id}) class='k-button k-button-icontext k-grid-update'><img style='border:1px solid black' id=imgActive src=../../Images/active_1.png /></a> #} else {# <a href=javascript:void(0) id=btnActive_${Id} onclick=changeCheckbox(this, '1', ${Id}) class='k-button k-button-icontext k-grid-update'><img style='border:1px solid black' id=imgActive src=../../Images/active_0.png /></a> #}#");

function changeCheckbox(obj, status, id) {
    var parentTr = obj.parentNode.parentNode;
    $('[id="btnEdit_' + id + '"]').click();

    parentTr.childNodes[5].childNodes[0].setAttribute("id", "btnUpdate_" + id); // my Update button is in the 6th column over
    parentTr.childNodes[0].childNodes[0].setAttribute("id", "chkbox_" + id);
    $('[id=chkbox_' + id + ']').click().trigger("change");
    $('[id=chkbox_' + id + ']').blur();

    var btnUpdate = $('[id="btnUpdate_' + id + '"]');
    $('[id="btnUpdate_' + id + '"]').click();

}

当然,上面的代码假定复选框位于第一列。否则,childNodes[0]将该 chkbox setAttribute 行上的第一个调整为它所在的列,减一,因为它从零开始计数。

于 2014-10-22T05:11:15.640 回答
0

我做了一个很像@DontVoteMeDown 的解决方案。但是我有一个嵌套网格(主/详细信息),所以我从事件参数中获取父网格。我也只是在复选框上触发一个点击事件。

$("#grid .k-grid-content").on("change", "input.chkbx", function (e) {
    // Get the parent grid of the checkbox. This can either be the master grid or the detail grid.
    var parentGrid = $(e.target).closest('div[data-role="grid"]').data("kendoGrid");
    // Get the clicked cell.
    var td = $(e.target).closest("td");
    // Enter the cell's edit mode.
    parentGrid.editCell(td);
    // Find the checkbox in the cell (which now is in "edit-mode").
    var checkbox = td.children("input[type=checkbox]");
    // Trigger a click (which will toggle check/uncheck).
    checkbox.trigger("click");
});
于 2016-01-29T13:50:38.763 回答