le problème est que vous essayez de mettre en œuvre l'édition de cellule double-clic ce qui n'est pas supporté. Votre code actuel ne fonctionne pas parce que si la presse utilisateur Tab, Entrez ou Esc touche la nextCell
, prevCell
, saveCell
ou restoreCell
seront vraiment appelés, mais les tests de méthodes paramètre interne si cellEdit
est true
.
Pour montrer comment résoudre le problème que j'ai créé the demo qui utilise le code suivant:
cellsubmit: 'clientArray',
ondblClickRow: function (rowid, iRow, iCol) {
var $this = $(this);
$this.jqGrid('setGridParam', {cellEdit: true});
$this.jqGrid('editCell', iRow, iCol, true);
$this.jqGrid('setGridParam', {cellEdit: false});
},
afterEditCell: function (rowid, cellName, cellValue, iRow) {
var cellDOM = this.rows[iRow], oldKeydown,
$cellInput = $('input, select, textarea', cellDOM),
events = $cellInput.data('events'),
$this = $(this);
if (events && events.keydown && events.keydown.length) {
oldKeydown = events.keydown[0].handler;
$cellInput.unbind('keydown', oldKeydown);
$cellInput.bind('keydown', function (e) {
$this.jqGrid('setGridParam', {cellEdit: true});
oldKeydown.call(this, e);
$this.jqGrid('setGridParam', {cellEdit: false});
});
}
}
MISE À JOUR: Si vous souhaitez annuler ou enregistrer les dernières modifications d'édition si l'utilisateur clique sur une autre cellule on devrait étendre le code avec les éléments suivants:
beforeSelectRow: function (rowid, e) {
var $this = $(this),
$td = $(e.target).closest('td'),
$tr = $td.closest('tr'),
iRow = $tr[0].rowIndex,
iCol = $.jgrid.getCellIndex($td);
if (typeof lastRowIndex !== "undefined" && typeof lastColIndex !== "undefined" &&
(iRow !== lastRowIndex || iCol !== lastColIndex)) {
$this.jqGrid('setGridParam', {cellEdit: true});
$this.jqGrid('restoreCell', lastRowIndex, lastColIndex, true);
$this.jqGrid('setGridParam', {cellEdit: false});
$(this.rows[lastRowIndex].cells[lastColIndex])
.removeClass("ui-state-highlight");
}
return true;
}
The new demo montre les résultats.
MISE À JOUR 2: Vous pouvez également utiliser focusout
pour annuler ou enregistrer les dernières modifications de modification. Voir one more demo qui utilisent le code:
ondblClickRow: function (rowid, iRow, iCol) {
var $this = $(this);
$this.jqGrid('setGridParam', {cellEdit: true});
$this.jqGrid('editCell', iRow, iCol, true);
$this.jqGrid('setGridParam', {cellEdit: false});
},
afterEditCell: function (rowid, cellName, cellValue, iRow, iCol) {
var cellDOM = this.rows[iRow].cells[iCol], oldKeydown,
$cellInput = $('input, select, textarea', cellDOM),
events = $cellInput.data('events'),
$this = $(this);
if (events && events.keydown && events.keydown.length) {
oldKeydown = events.keydown[0].handler;
$cellInput.unbind('keydown', oldKeydown);
$cellInput.bind('keydown', function (e) {
$this.jqGrid('setGridParam', {cellEdit: true});
oldKeydown.call(this, e);
$this.jqGrid('setGridParam', {cellEdit: false});
}).bind('focusout', function (e) {
$this.jqGrid('setGridParam', {cellEdit: true});
$this.jqGrid('restoreCell', iRow, iCol, true);
$this.jqGrid('setGridParam', {cellEdit: false});
$(cellDOM).removeClass("ui-state-highlight");
});
}
}
MISE À JOUR 3: A partir de jQuery 1.8 devrait utiliser $._data($cellInput[0], 'events');
au lieu de $cellInput.data('events')
pour obtenir la liste de tous les événements de $cellInput
.
Cela semble très bien, mais serait-il possible d'ajouter une fonctionnalité lorsque l'utilisateur clique en dehors de la cellule active ou à l'extérieur du composant de grille, cet éditeur inline actif se ferme? –
@stackoverflow: C'est aussi possible. Voir la partie "MISE À JOUR" de la réponse et de la nouvelle démo. – Oleg
Grand progrès! Mais lorsque je clique en dehors des cellules ou des lignes (par exemple, barre d'outils de la grille, titre de la colonne de la grille, etc.) ou en dehors de la grille, l'éditeur inline est toujours actif et ne se ferme pas. Est-il possible d'ajouter de telles fonctionnalités? Merci. –