Kendo 网格 MVC:使用主复选框更改所有行中的值
Kendo Grid MVC: Change a value in all rows with a master checkbox
首先,我是一个javascript菜鸟,所以我的代码既不漂亮也不聪明。 :(
我有一个非常基本的 Kendo 网格,我向其中添加了两列。第一列包含一个复选框(我称它们为 minionCheckBox),第二列包含一个布尔值(来自数据源),我将其称为 isChecked,默认设置为 false。
此外,我在 table header 中有一个 masterCheckBox,它应该切换所有 minions。
两种复选框类型都是这样添加的:
@(Html.Kendo().Grid<MVC5KendoTestWeb.Models.DTOs.DTO_User>()
.Name("TestGrid")
.Columns(columns =>
{
columns.Template(@<text></text>)
.HeaderTemplate("<input class='checkbox masterCheckBox' type='checkbox' /> <strong>Alle</strong>")
.ClientTemplate(@"
<input class='checkbox minionCheckBox' type='checkbox' data-bind='checked: isChecked' #= isChecked ? checked='checked' : '' # />")
.Width(80);
columns.Bound(cn => cn.isChecked).HtmlAttributes(new { @class = "isChecked" });
})
.DataSource(dataSource => dataSource
.Ajax()
.Create(create => create.Action("CreateUserData", "XXX"))
.Read(read => read.Action("ReadUserData", "XXX"))
.Update(update => update.Action("UpdateUserData", "XXX"))
.Destroy(destroy => destroy.Action("DestroyUserData", "XXX"))
.Model(model =>
{
model.Id(cn => cn.ID);
})
.PageSize(20)
.ServerOperation(true)
)
.Editable(editable => editable.Mode(GridEditMode.PopUp))
)
每当我在同一行中切换复选框时,我想更改 isChecked 的值。这似乎按照我的预期使用以下代码工作:
var grid = $("#TestGrid").data("kendoGrid");
grid.tbody.on("change", function (e) {
var isMinionChecked = $(e.target).prop("checked");
var row = $(e.target).closest("tr");
var item = grid.dataItem(row);
if (isMinionChecked) {
item.set("isChecked", true);
} else {
item.set("isChecked", false);
}
if (!item.isChecked) {
var isMasterChecked = $(".masterCheckBox").prop("checked");
if (isMasterChecked) {
$('.masterCheckBox').prop('checked', false);
}
}
})
这是我的问题:现在我想在每次检查 masterCheckBox 时对所有行执行相同的操作。这是我的代码:
var grid = $("#TestGrid").data("kendoGrid");
$(".masterCheckBox").on("click", function () {
var isMasterChecked = $(".masterCheckBox").prop("checked");
grid.table.find(".minionCheckBox").each(function () {
var row = $(this).closest("tr");
var item = grid.dataItem(row);
if (isMasterChecked) {
$(this).prop("checked", true);
item.set("isChecked", true);
} else {
$(this).prop("checked", false);
item.set("isChecked", false);
}
})
})
但是,它只会切换第一行中的复选框并将该行中的 isChecked 设置为 true。当我删除两条 item.set 行时,它可以完美运行并选中或取消选中所有复选框。
我知道代码还不完美,我还需要添加一些东西,但据我所知,现在至少应该做这两件事:切换所有复选框并将所有 isChecked 字段设置为正确的值。
谁能帮我解决这个问题?
function toggleCheckbox() {
$(".masterCheckBox").on("click", function (e) {
var grid = $("#TestGrid").data("kendoGrid");
var ds = grid.dataSource.data();
var isMasterChecked = $(".masterCheckBox").prop("checked");
for (var i = 0; i < ds.length; i++) {
var dataItem = ds[i];
dataItem.isChecked = isMasterChecked;
}
grid.refresh();
})
}
function registerOnChangeEvent() {
var grid = $("#TestGrid").data("kendoGrid");
grid.tbody.on("change", function (e) {
var isMinionChecked = $(e.target).prop("checked");
var isMasterChecked = $(".masterCheckBox").prop("checked");
var row = $(e.target).closest("tr");
var item = grid.dataItem(row);
var oldChecked = item.get("isChecked");
if (isMinionChecked != oldChecked) {
item.set("isChecked", isMinionChecked);
}
if (!isMinionChecked && isMasterChecked) {
$('.masterCheckBox').prop('checked', false);
}
})
}
首先,我是一个javascript菜鸟,所以我的代码既不漂亮也不聪明。 :(
我有一个非常基本的 Kendo 网格,我向其中添加了两列。第一列包含一个复选框(我称它们为 minionCheckBox),第二列包含一个布尔值(来自数据源),我将其称为 isChecked,默认设置为 false。
此外,我在 table header 中有一个 masterCheckBox,它应该切换所有 minions。
两种复选框类型都是这样添加的:
@(Html.Kendo().Grid<MVC5KendoTestWeb.Models.DTOs.DTO_User>()
.Name("TestGrid")
.Columns(columns =>
{
columns.Template(@<text></text>)
.HeaderTemplate("<input class='checkbox masterCheckBox' type='checkbox' /> <strong>Alle</strong>")
.ClientTemplate(@"
<input class='checkbox minionCheckBox' type='checkbox' data-bind='checked: isChecked' #= isChecked ? checked='checked' : '' # />")
.Width(80);
columns.Bound(cn => cn.isChecked).HtmlAttributes(new { @class = "isChecked" });
})
.DataSource(dataSource => dataSource
.Ajax()
.Create(create => create.Action("CreateUserData", "XXX"))
.Read(read => read.Action("ReadUserData", "XXX"))
.Update(update => update.Action("UpdateUserData", "XXX"))
.Destroy(destroy => destroy.Action("DestroyUserData", "XXX"))
.Model(model =>
{
model.Id(cn => cn.ID);
})
.PageSize(20)
.ServerOperation(true)
)
.Editable(editable => editable.Mode(GridEditMode.PopUp))
)
每当我在同一行中切换复选框时,我想更改 isChecked 的值。这似乎按照我的预期使用以下代码工作:
var grid = $("#TestGrid").data("kendoGrid");
grid.tbody.on("change", function (e) {
var isMinionChecked = $(e.target).prop("checked");
var row = $(e.target).closest("tr");
var item = grid.dataItem(row);
if (isMinionChecked) {
item.set("isChecked", true);
} else {
item.set("isChecked", false);
}
if (!item.isChecked) {
var isMasterChecked = $(".masterCheckBox").prop("checked");
if (isMasterChecked) {
$('.masterCheckBox').prop('checked', false);
}
}
})
这是我的问题:现在我想在每次检查 masterCheckBox 时对所有行执行相同的操作。这是我的代码:
var grid = $("#TestGrid").data("kendoGrid");
$(".masterCheckBox").on("click", function () {
var isMasterChecked = $(".masterCheckBox").prop("checked");
grid.table.find(".minionCheckBox").each(function () {
var row = $(this).closest("tr");
var item = grid.dataItem(row);
if (isMasterChecked) {
$(this).prop("checked", true);
item.set("isChecked", true);
} else {
$(this).prop("checked", false);
item.set("isChecked", false);
}
})
})
但是,它只会切换第一行中的复选框并将该行中的 isChecked 设置为 true。当我删除两条 item.set 行时,它可以完美运行并选中或取消选中所有复选框。
我知道代码还不完美,我还需要添加一些东西,但据我所知,现在至少应该做这两件事:切换所有复选框并将所有 isChecked 字段设置为正确的值。
谁能帮我解决这个问题?
function toggleCheckbox() {
$(".masterCheckBox").on("click", function (e) {
var grid = $("#TestGrid").data("kendoGrid");
var ds = grid.dataSource.data();
var isMasterChecked = $(".masterCheckBox").prop("checked");
for (var i = 0; i < ds.length; i++) {
var dataItem = ds[i];
dataItem.isChecked = isMasterChecked;
}
grid.refresh();
})
}
function registerOnChangeEvent() {
var grid = $("#TestGrid").data("kendoGrid");
grid.tbody.on("change", function (e) {
var isMinionChecked = $(e.target).prop("checked");
var isMasterChecked = $(".masterCheckBox").prop("checked");
var row = $(e.target).closest("tr");
var item = grid.dataItem(row);
var oldChecked = item.get("isChecked");
if (isMinionChecked != oldChecked) {
item.set("isChecked", isMinionChecked);
}
if (!isMinionChecked && isMasterChecked) {
$('.masterCheckBox').prop('checked', false);
}
})
}