Jih*_*heL 4 checkbox jqgrid treegrid
我在"name"列中构建了带嵌入式复选框的treeGrid,例如JSON数据:
{"id":"1","name":"<input type='checkbox' class='itmchk' ><strong>ECHANGEUR<\/strong>","level":"0","parent":"null","isLeaf":false,"expanded":true,"loaded":true}
Run Code Online (Sandbox Code Playgroud)
因为这些复选框跟随树边缘(我希望我很好理解,因为我是法国人).
当我标记/取消标记一行时,我想检查/取消选中子标题复选框,但在阅读后可能会发布帖子,我可以获得预期的结果.
例如说明:如果我单击父行复选框(因此它变为UNCHECKED),则子级别行变为UNCHECKED
我是jqGrid的新手,但它是一个很棒的工具,我想学习属性.请你能以这种方式开车送我吗?或者你能建议我在哪里可以找到我想做的例子吗?我查了一下文档但没有成功.
非常感谢JiheL
首先,我建议您不要将HTML片段放在JSON数据中.可以使用自定义格式化程序在网格单元格中包含复选框:
formatter: function (cellvalue) {
return "<input type='checkbox' class='itmchk' ><strong>" +
$.jgrid.htmlEncode(cellvalue) + "</strong>";
}
Run Code Online (Sandbox Code Playgroud)
要控制复选框的选中/取消选中,您可以使用beforeSelectRow网格的回调.jqGrid将内部click事件绑定到网格主体.因此,事件冒泡发生的元素上不会直接存在事件处理程序.它允许捕获一个回调内的任何复选框的检查/取消选中beforeSelectRow.里面的beforeSelectRow你应该首先测试它是否是单击您要控制的复选框.
回调beforeSelectRow有两个参数:rowid和事件对象.target事件对象的属性将是用户单击的DOM元素.因为您将自定义itmchk类添加到每个此类复选框,所以足以验证单击元素上的类.
接下来的问题是许多与TreeGrid一起使用的jqGrid方法(如getNodeChildren)具有record输入参数,但您只能rowid使用它.jqGrid在本地保存网格的加载项.所以,最简单的方式来获得record从rowid是使用getLocalRow方法.
结果,beforeSelectRow回调代码可能如下:
beforeSelectRow: function (rowid, e) {
var $this = $(this),
isLeafName = $this.jqGrid("getGridParam", "treeReader").leaf_field,
localIdName = $this.jqGrid("getGridParam", "localReader").id,
localData,
state,
setChechedStateOfChildrenItems = function (children) {
$.each(children, function () {
$("#" + this[localIdName] + " input.itmchk").prop("checked", state);
if (!this[isLeafName]) {
setChechedStateOfChildrenItems($this.jqGrid("getNodeChildren", this));
}
});
};
if (e.target.nodeName === "INPUT" && $(e.target).hasClass("itmchk")) {
state = $(e.target).prop("checked");
localData = $this.jqGrid("getLocalRow", rowid);
setChechedStateOfChildrenItems($this.jqGrid("getNodeChildren", localData), state);
}
}
Run Code Online (Sandbox Code Playgroud)
重要的是要提到仅在先前加载的项目上检查/取消选中子复选框.因为您一次加载网格数据并使用loaded: true属性,所以对您来说不是问题.
相应的演示显示上面的代码确实有效.这是我通过回答你之前的问题创建的演示的修改.