J’utilise jQgrid Free ( version 4.15.2 ) et j’ai besoin d’append la possibilité de modifier des lignes en ligne, ce qui n’est pas un problème du tout, car il est assez facile à configurer. Voici le code que j’utilise:
$.jgrid = $.jgrid || {}; $.jgrid.no_legacy_api = true; $.jgrid.useJSON = true; $(function () { "use ssortingct"; var $grid = $("#list"), pagerSelector = "#pager", customAddButton = function (options) { $grid.jqGrid('navButtonAdd', pagerSelector, options); $grid.jqGrid('navButtonAdd', '#' + $grid[0].id + "_toppager", options); }; $.fn.fmatter.customActionsFormatter = function (cellValue, options, rowData) { return ''; }; $grid.jqGrid({ url: '/ajax/plans_to_forms/get_all', datatype: "json", colNames: ["", "Id", "Form #", "Form", "Plan", "Class", "Drug"], colModel: [ {name: "act", formatter: "customActionsFormatter", width: 20, search: false}, {name: "Id", jsonmap: "Id", key: true, hidden: true}, {name: "FormId", align: 'center', fixed: true, frozen: true, resizable: false, width: 100}, {name: "FormName", width: 300}, {name: "PlanName", width: 300}, {name: "DrugGroupName", width: 300}, {name: "DrugName", width: 300} ], cmTemplate: {autoResizable: true, editable: true}, iconSet: "fontAwesome", rowNum: 25, guiStyle: "bootstrap", autoResizing: {compact: true}, rowList: [25, 50, 100, "10000:All"], viewrecords: true, autoencode: true, sortable: true, pager: pagerSelector, toppager: true, cloneToTop: true, hoverrows: true, multiselect: true, multiPageSelection: true, rownumbers: true, sortname: "Id", sortorder: "desc", loadonce: true, autowidth: true, autoresizeOnLoad: true, forceClientSorting: true, shrinkToFit: true, navOptions: { edit: false, add: false, del: false, search: false }, inlineEditing: {keys: true, defaultFocusField: "DrugGroupName", focusField: "DrugGroupName"}, onSelectRow: function (rowid, status, e) { var $self = $(this), savedRow = $self.jqGrid("getGridParam", "savedRow"); if (savedRow.length > 0 && savedRow[0].id !== rowid) { $self.jqGrid("restoreRow", savedRow[0].id); } $self.jqGrid("editRow", rowid, {focusField: e.target}); } }).jqGrid('navGrid', pagerSelector, { search: false, edit: false, add: false, del: false, refresh: true, cloneToTop: true }).jqGrid("filterToolbar", { ssortingngResult: true, searchOnEnter: false, defaultSearch: 'cn' }).jqGrid("gridResize").jqGrid('setFrozenColumns'); customAddButton({ caption: 'Delete selected', buttonicon: 'fa-trash-o', title: "Delete all selected rows", onClickButton: function () { var rowIds = $("#list").jqGrid('getGridParam', 'selarrrow'); if (rowIds.length > 0) { delete_all_link_modal.modal(); delete_all_link_modal.attr('data-link-ids', rowIds); } else { alert('You must select at least one item.'); } } }); });
La ligne suivante active l’édition en ligne:
inlineEditing: {keys: true, defaultFocusField: "DrugGroupName", focusField: "DrugGroupName"}
Où est mon problème? Je n’ai besoin que de modifier la colonne DrugGroupName
et la ligne ci-dessus rendent la ligne entière modifiable, ce qui m’amène aux questions suivantes:
Il est possible de ne modifier qu’un ensemble de colonnes au lieu de toutes? – Je vérifiais la documentation ici mais je ne trouvais rien d’utile
Il est possible d’envoyer les données au serveur dès que je clique ailleurs ou en appuyant sur la touche Entrée? – Je veux éviter le clic supplémentaire sur l’icône de sauvegarde.
UPDATE: J’ai déjà trouvé la réponse à ma première question. J’ai juste besoin de rendre la colonne non éditable lors de la définition de colModel
. Ex:
colModel: [ {name: "act", formatter: "customActionsFormatter", width: 20, search: false}, {name: "Id", jsonmap: "Id", key: true, hidden: true}, {name: "FormId", align: 'center', fixed: true, frozen: true, resizable: false, width: 100, editable: false}, {name: "FormName", width: 300, editable: false}, {name: "PlanName", width: 300, editable: false}, { name: "DrugGroupName", width: 300, edittype: "select", editoptions: { generateValue: true, selectFilled: function (options) { setTimeout(function () { $(options.elem).select2({ width: "100%" }); }, 0); } }, stype: "select", searchoptions: { sopt: ["eq", "ne"], generateValue: true, noFilterText: "Any", selectFilled: function (options) { $(options.elem).select2({ width: "100%" }); } } }, {name: "DrugName", width: 300, editable: false} ]
De cette façon, je force DrugGroupName
à être le seul à être éditable.
Je pense que votre code a beaucoup de petits problèmes. J’ai préparé la démo https://jsfiddle.net/OlegKi/rmo2370r/19/ , qui devrait résoudre le plus de problèmes et montrer l’utilisation de select2 et certaines fonctionnalités de jqGrid gratuit.
Le premier petit problème est l’utilisation de rowid correct. Vous utilisez la colonne actuellement masquée
{name: "Id", jsonmap: "Id", key: true, hidden: true}
C’est un malentendu typique des utilisateurs qui utilisent jqGrid. Rowid sera enregistré en tant qu’atsortingbut id
de lignes (
éléments). Voir la photo Il n’est pas nécessaire de placer les informations de cas en tant qu’élément
caché à l’intérieur de la grid. Au lieu de cela, vous pouvez simplement utiliser les options jqGrid suivantes
prmNames: { id: "Id" }, jsonReader: { id: "Id" },
au lieu. L’option jsonReader.id
indique à jqGrid où obtenir rowid lors du remplissage de la grid et prmNames.id
fournit le nom de id lors de l’édition de la grid.
Pour remplir jqGrid dans JSFiddle, vous pouvez utiliser le service Echo:
url: '/echo/json/', datatype: 'json', mtype: 'POST', // required for '/echo/json/' postData: { json: JSON.ssortingngify(mydata) },
La demande à l’URL /echo/json/
will mydata
tant que réponse. On peut utiliser l’onglet Réseau des Outils de développement de Chrome / IE / Firefox pour examiner le trafic HTTP en détail.
De la même manière, on peut utiliser
editurl: '/echo/json/', formDeleting: { url: '/echo/json/', ... }
pour l’édition en ligne et la suppression de formulaires.
Les prochains changements. J’ai ajouté la propriété resetWidthOrg: true
dans autoResizing
:
autoResizing: { compact: true, resetWidthOrg: true }
qui a changé les résultats de travail autowidth: true
en combinaison avec autoresizeOnLoad: true
. Vous pouvez voir que la largeur de toutes les colonnes est beaucoup mieux basée sur le contenu des colonnes qu’avant. Voir les numéros pour plus de détails.
Je n’ai pas compris l’objective de customActionsFormatter
. Je l’ai remplacé pour les actions de formatage standard
{ name: "act", template: "actions" }
JqGrid gratuit permet très facilement de personnaliser les boutons d’action si nécessaire. Voir la réponse et l’article du wiki pour plus de détails.
Votre ancien code utilisé
cmTemplate: { autoResizable: true, editable: true }
et définissez editable: false
dans la plupart des colonnes. Au lieu de cela, il suffit de supprimer editable: true
de cmTemplate
, d’append editable: true
dans une seule colonne, que vous devez modifier, et d’inclure dans cmTemplate
autre paramètre généralement utilisé dans colModel
:
cmTemplate: { width: 300, autoResizable: true }
Beaucoup d’autres codes pourraient également être simplifiés. Voir le code modifié de onSelectRow
par exemple.
Pour personnaliser la boîte de dialog de suppression, vous pouvez utiliser les parameters suivants:
formDeleting: { url: '/echo/json/', // '/ajax/plans_to_forms/delete/' in final solution width: 320, caption: 'Delete Plan to Form Link', msg: 'Are you sure you want to delete this link?', beforeShowForm: function ($form) { var rowids = $form.find("#DelData>td").data("rowids"); console.log(rowids); if (rowids.length > 1) { $form.find("td.delmsg") .html('Are you sure you want to delete all the selected form links?'); } } }
Supprimer envoie les données Id=20622,20626
et oper=del
au serveur ( formDeleting.url
). SerializeDelData peut être utilisé pour convertir les données au format JSON si nécessaire.
Pour envoyer plus de données des colonnes au serveur lors de l’édition, vous pouvez append editable: "hidden"
dans certaines colonnes. J’ai ajouté la propriété dans la colonne FormId
de la démo et les données FormId
au serveur pendant l’édition ressemblaient à
{"FormId":"3393","DrugGroupName":"Some other value","oper":"edit","Id":"20620"}
Pour renseigner les données de en respectant les demandes Ajax supplémentaires adressées au serveur, vous devez utiliser
editoptions.dataUrl
. J’ai ajouté dans la démo editoptions.postData
pour simuler uniquement la demande réelle adressée au serveur:
editoptions: { dataUrl: "/echo/json/", postData: { json: JSON.ssortingngify([ "Non-Specialty Medications", "General Pharmacy Authorization", "Some other value" ]) }, buildSelect: function (data) { var select = ""; }, selectFilled: function(options) { var $self = $(this); setTimeout(function() { $(options.elem).select2({ width: "100%" }).on('select2:select', function (e) { // save the data on selection $self.jqGrid("saveRow", options.rowid); }); }, 0); } }, stype: "select", searchoptions: { sopt: ["eq", "ne"], generateValue: true, noFilterText: "Any", selectFilled: function(options) { $(options.elem).select2({ width: "100%" }); } } }
La requête ci-dessus à dataUrl
renvoie la chaîne JSON [ "Non-Specialty Medications", "General Pharmacy Authorization", "Some other value" ]
et buildSelect
convertit les données en fragment HTML avec contenant toutes les
. Le résultat résultant sera converti en select2 à l’intérieur du rappel
selectFilled
. Enfin l’utilisation du code
ajaxSelectOptions: { type: "POST", dataType: "json" }
possibilité de changer les parameters de la requête Ajax en dataUrl
. La démo https://jsfiddle.net/OlegKi/rmo2370r/19/ contient d’autres modifications mineures, telles que la suppression d’un div de pager vide inutile et l’utilisation de pager: true
de la même manière que vous utilisez déjà toppager: true
. C’est une fonctionnalité supplémentaire que j’ai implémentée dans jqGrid free fork pour simplifier l’utilisation de jqGrid.