Avec JQGRID, est-il possible de regrouper les données de niveau de ligne comme dans l'image ci-jointe? Fondamentalement, je voulais diviser les données pour une rangée particulière en plusieurs rangées de certaines colonnes.
Exemple
Je vous suggère d'utiliser cellattr
pour définir rowspan
attribut sur certaines cellules ou ensemble style="display:none"
Pour cacher une autre cellule inutile. L'idée est la même que avec colspan
de la réponse .
Comme le résultat vous pouvez créer la grille suivante (voir la démo )
ou un autre (voir ne autre démo )
Le problème avec les grilles est dans une autre caractéristique JQGrid, comme le tri, la pagination, la planant et la sélection. Certains des fonctionnalités que l'on peut mettre en œuvre avec des efforts supplémentaires, mais un autre est plus difficile à mettre en œuvre.
Le code que j'ai utilisé dans la démo est la suivante:
var mydata = [
{ id: "1", country: "USA", state: "Texas", city: "Houston", attraction: "NASA", Zip: "77058", attr: {country: {rowspan: "5"}, state: {rowspan: "5"}} },
{ id: "2", country: "USA", state: "Texas", city: "Austin", attraction: "6th street", Zip: "78704", attr: {country: {display: "none"}, state: {display: "none"}} },
{ id: "3", country: "USA", state: "Texas", city: "Arlinton", attraction: "Cowboys Stadium", Zip: "76011", attr: {country: {display: "none"}, state: {display: "none"}} },
{ id: "4", country: "USA", state: "Texas", city: "Plano", attraction: "XYZ place", Zip: "54643", attr: {country: {display: "none"}, state: {display: "none"}} },
{ id: "5", country: "USA", state: "Texas", city: "Dallas", attraction: "Reunion tower", Zip: "12323", attr: {country: {display: "none"}, state: {display: "none"}} },
{ id: "6", country: "USA", state: "California", city: "Los Angeles", attraction: "Hollywood", Zip: "65456", attr: {country: {rowspan: "4"}, state: {rowspan: "4"}} },
{ id: "7", country: "USA", state: "California", city: "San Francisco", attraction: "Golden Gate bridge", Zip: "94129", attr: {country: {display: "none"}, state: {display: "none"}} },
{ id: "8", country: "USA", state: "California", city: "San Diego", attraction: "See world", Zip: "56653", attr: {country: {display: "none"}, state: {display: "none"}} },
{ id: "9", country: "USA", state: "California", city: "Anaheim", attraction: "Disneyworld", Zip: "92802", attr: {country: {display: "none"}, state: {display: "none"}} }
],
arrtSetting = function (rowId, val, rawObject, cm) {
var attr = rawObject.attr[cm.name], result;
if (attr.rowspan) {
result = ' rowspan=' + '"' + attr.rowspan + '"';
} else if (attr.display) {
result = ' style="display:' + attr.display + '"';
}
return result;
};
$("#list").jqGrid({
datatype: 'local',
data: mydata,
colNames: ['Country', 'State', 'City', 'Attraction', 'Zip code'],
colModel: [
{ name: 'country', width: 70, align: 'center', cellattr: arrtSetting },
{ name: 'state', width: 80, align: 'center', cellattr: arrtSetting },
{ name: 'city', width: 90 },
{ name: 'attraction', width: 120 },
{ name: 'Zip', index: 'tax', width: 60, align: 'right' }
],
cmTemplate: {sortable: false},
rowNum: 100,
gridview: true,
hoverrows: false,
autoencode: true,
ignoreCase: true,
viewrecords: true,
height: '100%',
caption: 'Grid with rowSpan attributes',
beforeSelectRow: function () {
return false;
}
});
J'ai utilisé dans le code ci-dessus attr
propriété placée avec les données d'entrée. C'est juste un exemple. Je voulais faire la mise en œuvre de cellattr
fonction plus simple. Vous pouvez utiliser la même idée et pour placer les informations nécessaires à cellattr
dans un autre format.
Ceci est ma solution pour les données JSON:
var prevCellVal = { cellId: undefined, value: undefined };
$("#list").jqGrid({
url: 'your WS url'
datatype: 'json',
mtype: "POST",
ajaxGridOptions: {
contentType: "application/json"
},
colNames: ['Country', 'State', 'City', 'Attraction', 'Zip code'],
colModel: [
{ name: 'country', width: 70, align: 'center',
cellattr: function (rowId, val, rawObject, cm, rdata) {
var result;
if (prevCellVal.value == val) {
result = ' style="display: none" rowspanid="' + prevCellVal.cellId + '"';
}
else {
var cellId = this.id + '_row_' + rowId + '_' + cm.name;
result = ' rowspan="1" id="' + cellId + '"';
prevCellVal = { cellId: cellId, value: val };
}
return result;
}
},
{ name: 'state', width: 80, align: 'center' },
{ name: 'city', width: 90 },
{ name: 'attraction', width: 120 },
{ name: 'Zip', index: 'tax', width: 60, align: 'right' }
],
cmTemplate: {sortable: false},
rowNum: 100,
gridview: true,
hoverrows: false,
autoencode: true,
ignoreCase: true,
viewrecords: true,
height: '100%',
caption: 'Grid with rowSpan attributes',
beforeSelectRow: function () {
return false;
},
gridComplete: function () {
var grid = this;
$('td[rowspan="1"]', grid).each(function () {
var spans = $('td[rowspanid="' + this.id + '"]', grid).length + 1;
if (spans > 1) {
$(this).attr('rowspan', spans);
}
});
}
});
Cet exemple est pour une seule colonne, mais avec quelques corrections, il peut également être utilisé pour plusieurs colonnes.
Hé là "pistipanko"
J'ai fait un changement dans votre solution, je pense que cela fonctionnait mieux.
cellattr: function(rowId, val, rawObject, cm, rdata) {
var result;
var cellId = this.id + '_row_' + rawObject[3] + grid.getGridParam('page');
if (prevCellVal.cellId == cellId) {
result = ' style="display: none"';
}
else {
result = ' rowspan="' + rawObject[6] + '"';
prevCellVal = { cellId: cellId, value: rawObject[3] };
}
return result;
}
Je fais le groupement avec la valeur d'un autre collumn, c'est pourquoi le rawObject[3]
Et j'utilise une valeur des rangées renvoyées de l'application dans le rawObject[6]
Fonctionne très bien.
J'espère que ça aide :)