Kendo Grid按钮点击更新字段:普通列与命令列选型咨询
嗨,我来帮你梳理下这个问题~其实两种方式都能实现需求,但得看哪种更贴合你的布局和场景。先拆解核心逻辑:点击按钮时要更新当前行的TradesmanId字段,并且让Kendo Grid感知到这个变更,这样后续触发保存事件时才能把这个值正常提交上去。
方案一:自定义模板列(适合和业务字段同列/灵活布局场景)
如果你希望按钮和TradeHrs这类业务字段放在逻辑关联的列里,用模板列会更灵活。你可以在列定义里通过模板渲染按钮,再绑定点击事件:
.Columns(trdcol => { trdcol.Bound(f => f.TradeHrs).Title("工时"); // 自定义按钮列,用ClientTemplate渲染按钮 trdcol.Template(@<text></text>) .Title("分配技工") .ClientTemplate("<button class='assign-to-me-btn' style='padding:4px 8px;'>分配给我</button>"); // 其他业务列... })
然后在前端JS里写点击处理逻辑,关键是用set方法更新字段(触发网格的变更跟踪):
// 假设你能通过全局变量/方法获取登录用户ID,比如getCurrentLoginUserId() $(document).on("click", ".assign-to-me-btn", function() { const grid = $("#yourGridId").data("kendoGrid"); const currentRow = $(this).closest("tr"); const dataItem = grid.dataItem(currentRow); // 获取登录用户ID const loginUserId = getCurrentLoginUserId(); // 用set方法更新字段,自动标记为待提交的变更 dataItem.set("TradesmanId", loginUserId); });
方案二:使用命令列(适合统一放置操作按钮的场景)
如果这个分配按钮需要和编辑、删除等操作按钮归为一类,用Kendo自带的命令列会更规范,它本身就是为操作类按钮设计的:
.Columns(trdcol => { trdcol.Bound(f => f.TradeHrs).Title("工时"); // 命令列自定义按钮 trdcol.Command(cmd => { cmd.Custom("AssignToMe") .Text("分配给我") .Click("handleAssignToMe"); }).Title("操作"); // 其他业务列... })
对应的JS点击处理函数:
function handleAssignToMe(e) { e.preventDefault(); const grid = $("#yourGridId").data("kendoGrid"); const dataItem = grid.dataItem($(e.currentTarget).closest("tr")); const loginUserId = getCurrentLoginUserId(); // 同样用set方法更新字段,确保网格跟踪变更 dataItem.set("TradesmanId", loginUserId); }
核心注意事项
- 必须用
dataItem.set("TradesmanId", userId)而不是直接赋值dataItem.TradesmanId = userId,直接赋值不会触发Kendo的变更跟踪机制,网格不会把这个值当成待提交的修改。 - 要确保
TradesmanId是你网格数据源模型中定义的字段,这样才能被正确跟踪和提交。 - 不管用哪种方案,只要通过
set方法更新,这个值就会被保留到网格的保存变更事件触发时,批量提交或行级提交都会包含它。
内容的提问来源于stack exchange,提问作者mgh75
相关产品推荐
相关产品推荐

