Wir haben dasselbe Problem mit Teilrastern gelöst, und die Lösung lässt sich möglicherweise an ein Gruppierungsszenario anpassen. Wir haben benutzerdefinierte Formatierer um Styling- und Datenattribute sowohl für den Link/das Kontrollkästchen in der Kopfzeile als auch für die Kontrollkästchen in den Unterrastern hinzuzufügen. Dann haben wir einen Link oder ein Kontrollkästchen in der Kopfzeile mit einem Ereignis, das jQuery verwendet, um alle Kontrollkästchen im Untergitter mit dem entsprechenden Datenattribut und Stil auszuwählen. Schließlich fügt das Ereignis "grid load complete" den Click-Event-Handler für den Link "check all" hinzu.
Hier ist ein Beispiel für einen benutzerdefinierten Formatierer für die Spalte mit dem Kontrollkästchen im Untergitter. Beachten Sie das data-groupingId-Attribut, das einen Wert speichert, der verwendet wird, um die Kopfzeile mit den Zeilen des Unterrasters zu verknüpfen.
function checkBoxColumnFormatter(cellvalue, options, rowObject) {
return "<input type=\"checkbox\"" + data-groupingId=\"" + rowObject.GroupingId + "\" class=\"subgridCheck\" />";
}
Hier ist ein Beispiel für einen benutzerdefinierten Formatierer für die Spalte "check all". Beachten Sie das data-groupingId-Attribut, das einen Wert speichert, der verwendet wird, um die Kopfzeile mit den Untergitterzeilen zu verknüpfen.
function checkAllColumnFormatter(cellValue, options, rowObject) {
var link = $("<a class=\"checkAll\" href=\"#\" data-groupingId=\"" + rowObject.Id + "\">Check All</a>");
var linkHtml = $("<div>").append(link.clone()).remove().html();
return linkHtml;
}
Hier ist das Load-Completion-Ereignis, das die Klick-Ereignisse für die "Check-All"-Links, die im obigen Formatierer erstellt wurden, einbindet.
function mainGridLoadComplete(data) {
$(".checkAll").click(function (e) {
checkSubGridRows(
$(this).attr("data-groupingId")); // Use the data attribute to specify the value that will be on all the *relevant* subgrid checkboxes.
});
},
Und schließlich ist da noch die Methode, die die Arbeit erledigt.
function checkSubGridRows(groupingId) {
$("#GridId .subgridCheck[data-groupingId=\"" + groupingId + "\"]").not(":disabled").each(
function () {
$(this).attr("checked", "checked");
});
}
Das hat bei uns sehr gut funktioniert. Alles in allem würde ich, wenn die Dinge so kompliziert werden, lieber ein clientseitiges Modell haben, das Daten vom JSON-Webdienst empfängt und die maßgebliche Quelle für das jqGrid ist. Ich denke, dass dies letztlich besser wäre, als wenn das jqGrid die Daten selbst abgreift und die eigentlichen Datenobjekte verschluckt, was es schwierig oder unmöglich macht, die Daten direkt zu referenzieren oder zu verarbeiten. Allerdings ist das Erstellen und Verwalten einer clientseitigen Modell/View-Trennung kein triviales Unterfangen. Daher funktioniert dies als schnelle Alternative. Aber Vorsicht, denn das kann schnell aus dem Ruder laufen.