刷新单个Kendo网格行

raf*_*foo 40 kendo-ui kendo-grid

有没有办法刷新单个Kendo网格行而不刷新整个数据源或使用jQuery设置每个单元格的值?

Ona*_*Bai 54

如何定义要更新的行?我将假设这是您选择的行,并且正在更新的列的名称是symbol.

// Get a reference to the grid
var grid = $("#my_grid").data("kendoGrid");

// Access the row that is selected
var select = grid.select();
// and now the data
var data = grid.dataItem(select);
// update the column `symbol` and set its value to `HPQ`
data.set("symbol", "HPQ");
Run Code Online (Sandbox Code Playgroud)

记住的内容DataSource是一个observable对象,这意味着您可以使用更新set和变化应该体现神奇grid.

  • 如果它们是单元格上的自定义模板(不可编辑,并且该模板调用函数),我们应该怎么做.在数据项上调用set似乎不会重绘模板. (4认同)
  • @OnaBai谢谢.事实证明,如果一个列在模型中设置为不可编辑(例如`model.Fields [0] .editable == false`那么如果你调用`data.set('ProductName','Cat') )`在该列上它不会在网格中更新.我认为这可以通过自定义模板修复,如果真的有必要的话 (4认同)

Ada*_*ley 34

data.set实际上会刷新整个网格并databound在某些情况下发送事件.这非常缓慢且没必要.它还会折叠任何不理想的扩展细节模板.

我建议你使用我写的这个函数来更新kendo网格中的单行.

// Updates a single row in a kendo grid without firing a databound event.
// This is needed since otherwise the entire grid will be redrawn.
function kendoFastRedrawRow(grid, row) {
    var dataItem = grid.dataItem(row);

    var rowChildren = $(row).children('td[role="gridcell"]');

    for (var i = 0; i < grid.columns.length; i++) {

        var column = grid.columns[i];
        var template = column.template;
        var cell = rowChildren.eq(i);

        if (template !== undefined) {
            var kendoTemplate = kendo.template(template);

            // Render using template
            cell.html(kendoTemplate(dataItem));
        } else {
            var fieldValue = dataItem[column.field];

            var format = column.format;
            var values = column.values;

            if (values !== undefined && values != null) {
                // use the text value mappings (for enums)
                for (var j = 0; j < values.length; j++) {
                    var value = values[j];
                    if (value.value == fieldValue) {
                        cell.html(value.text);
                        break;
                    }
                }
            } else if (format !== undefined) {
                // use the format
                cell.html(kendo.format(format, fieldValue));
            } else {
                // Just dump the plain old value
                cell.html(fieldValue);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

// Get a reference to the grid
var grid = $("#my_grid").data("kendoGrid");

// Access the row that is selected
var select = grid.select();
// and now the data
var data = grid.dataItem(select);

// Update any values that you want to
data.symbol = newValue;
data.symbol2 = newValue2;
...

// Redraw only the single row in question which needs updating
kendoFastRedrawRow(grid, select);

// Then if you want to call your own databound event to do any funky post processing:
myDataBoundEvent.apply(grid);
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有在网格上进行编辑,而是在弹出窗口中进行编辑,该怎么办?如何确定正在编辑的行? (2认同)

Sru*_*lik 6

我找到了一种方法来更新网格dataSource并在网格中显示而不刷新所有网格.例如,您有一个选定的行,并且您想要更改列"名称"值.

//the grid
var grid = $('#myGrid').data('kendoGrid');    
// Access the row that is selected
var row = grid.select();
//gets the dataItem
var dataItem = grid.dataItem(row);
//sets the dataItem   
dataItem.name = 'Joe';
//generate a new row html
var rowHtml = grid.rowTemplate(dataItem);
//replace your old row html with the updated one
row.replaceWith(rowHtml);
Run Code Online (Sandbox Code Playgroud)