Прежде всего я рекомендую вам не размещать фрагменты HTML внутри данных JSON. Можно использовать custom formatter включить флажки внутри ячеек сетки:
formatter: function (cellvalue) {
return "<input type='checkbox' class='itmchk' ><strong>" +
$.jgrid.htmlEncode(cellvalue) + "</strong>";
}
Для контроля проверки/Непроверки флажков вы можете использовать beforeSelectRow
дозвон сетки. jqGrid привязано внутренне click
событие к телу сетки. Таким образом, обработчик событий не существует непосредственно на элементе event bubbling. Это позволяет уловить проверку/снятие отметки любых флажков внутри одного beforeSelectRow
обратного вызова. Внутри beforeSelectRow
вы должны сначала проверить, был ли он щелчок на флажке, который вы хотите контролировать.
Обратный звонок beforeSelectRow
имеет два параметра: rowid
и event object. Свойством target
объекта события будет элемент DOM, который был нажат пользователем. Поскольку вы добавляете свой собственный класс itmchk
к каждому из таких флажков, этого будет достаточно, чтобы проверить класс на клике.
Следующая проблема заключается в том, что многие методы jqGrid, которые работают с TreeGrid, такие как 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);
}
}
Важно отметить, что дети флажки будут проверены/снято только на предварительно нагруженные элементах. Поскольку вы загружаете данные сетки сразу и используете свойство loaded: true
, это не проблема для вас.
Соответствие demo показывает, что приведенный выше код действительно работает. Это модификация демо, которую я создал, отвечая на ваш предыдущий вопрос.
Я очень благодарю вас за вашу помощь, вы, безусловно, мастер с jqGrid, поскольку вы знаете много чего об этом. Еще раз спасибо за то, что вы делитесь с новыми пользователями.Я больше не буду вас беспокоить, но, следуя приведенному выше вопросу, я не говорю о переключателе, который иногда заменяет флажки в соответствии с значением уровня базы данных. Есть ли способ проверить значение другой ячейки в форматировании, чтобы я мог выбрать переключатель или флажок для добавления в ячейку? Я думаю, что это уровень новичка, но я не понимаю, как это сделать. В очередной раз благодарим за помощь. JiheL – JiheL
Пожалуйста, не тратьте время на мой предыдущий комментарий, я нашел решение заменить флажок radobutton на значение уровня из базы данных. Еще раз спасибо за ваше терпение. Имейте хороший день JiheL – JiheL
@ user2132268: Добро пожаловать! – Oleg