gpt4 book ai didi

javascript - 如果满足条件,则使 Kendo Grid 中的单元格只读

转载 作者:行者123 更新时间:2023-12-03 00:44:44 28 4
gpt4 key购买 nike

假设我有这样的数据:

[
{ID: 1, SomeForeignKeyID: 4, IsFkEnabled: true},
{ID: 2, SomeForeignKeyID: 9, IsFkEnabled: false}
]

Kendo Grid 正在使用此数据:

columns.Bound(m => m.ID);
columns.ForeignKey(p => p.SomeForeignKeyID, ViewBag.ForeignKeys as IEnumerable<object>, "Value", "Name");

问题是:如何使foreignkey列可编辑,但只能在行中编辑,其中IsFkEnabled == true?编辑模式为InCell。

最佳答案

注释:

  • 此解决方案仅适用于单元格内编辑(内联或弹出编辑需要不同的方法)
  • 第一种方法可能会导致不必要的视觉效果(网格跳跃)在某些情况下;如果你有这样的经历,我推荐方法#2
  • 如果您想使用 MVC 包装器,方法 #2 可能不起作用(尽管可以扩展 Kendo.Mvc.UI.Fluent.GridEventBuilder);在这种情况下,您需要在 JS 中绑定(bind)编辑处理程序

方法#1

使用网格的edit事件,然后执行如下操作:

$("#grid").kendoGrid({
dataSource: dataSource,
height: "300px",
columns: columns,
editable: true,
edit: function (e) {
var fieldName = e.container.find("input").attr("name");
// alternative (if you don't have the name attribute in your editable):
// var columnIndex = this.cellIndex(e.container);
// var fieldName = this.thead.find("th").eq(columnIndex).data("field");

if (!isEditable(fieldName, e.model)) {
this.closeCell(); // prevent editing
}
}
});

/**
* @returns {boolean} True if the column with the given field name is editable
*/
function isEditable(fieldName, model) {
if (fieldName === "SomeForeignKeyID") {
// condition for the field "SomeForeignKeyID"
// (default to true if defining property doesn't exist)
return model.hasOwnProperty("IsFkEnabled") && model.IsFkEnabled;
}
// additional checks, e.g. to only allow editing unsaved rows:
// if (!model.isNew()) { return false; }

return true; // default to editable
}

Demo here (updated for Q1 2014)

要通过 MVC 流畅语法使用此功能,只需在名称上方指定匿名 edit 函数(例如 onEdit):

function onEdit(e) {
var fieldName = e.container.find("input").attr("name");
// alternative (if you don't have the name attribute in your editable):
// var columnIndex = this.cellIndex(e.container);
// var fieldName = this.thead.find("th").eq(columnIndex).data("field");

if (!isEditable(fieldName, e.model)) {
this.closeCell(); // prevent editing
}
}

并像这样引用它:

@(Html.Kendo().Grid()
.Name("Grid")
.Events(events => events.Edit("onEdit"))
)

这样做的缺点是编辑器会在编辑事件触发之前先创建,这有时会产生不良的视觉效果。

方法#2

通过使用触发 beforeEdit 事件的变体覆盖其 editCell 方法来扩展网格;为了使用网格选项,您还需要重写 init 方法:

var oEditCell = kendo.ui.Grid.fn.editCell;
var oInit = kendo.ui.Grid.fn.init;
kendo.ui.Grid = kendo.ui.Grid.extend({
init: function () {
oInit.apply(this, arguments);
if (typeof this.options.beforeEdit === "function") {
this.bind("beforeEdit", this.options.beforeEdit.bind(this));
}
},
editCell: function (cell) {
var that = this,
cell = $(cell),
column = that.columns[that.cellIndex(cell)],
model = that._modelForContainer(cell),
event = {
container: cell,
model: model,
field: column.field
};

if (model && this.trigger("beforeEdit", event)) {
// don't edit if prevented in beforeEdit
if (event.isDefaultPrevented()) return;
}

oEditCell.call(this, cell);
}
});
kendo.ui.plugin(kendo.ui.Grid);

然后像#1一样使用它:

$("#grid").kendoGrid({
dataSource: dataSource,
height: "300px",
columns: columns,
editable: true,
beforeEdit: function(e) {
var columnIndex = this.cellIndex(e.container);
var fieldName = this.thead.find("th").eq(columnIndex).data("field");

if (!isEditable(fieldName, e.model)) {
e.preventDefault();
}
}
});

这种方法的不同之处在于,编辑器不会首先被创建(并聚焦)。 beforeEdit 方法使用与 #1 相同的 isEditable 方法。查看demo for this approach here .

如果您想将此方法与 MVC 包装器一起使用,但不想/无法扩展 GridEventBuilder,您仍然可以在 JavaScript 中绑定(bind)事件处理程序(放置在网格 MVC 初始值设定项下方):

$(function() {
var grid = $("#grid").data("kendoGrid");
grid.bind("beforeEdit", onEdit.bind(grid));
});

关于javascript - 如果满足条件,则使 Kendo Grid 中的单元格只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20881484/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com