2016-08-24 2 views
0

Gratuit jqgrid contient 3 colonnes: Prix, Quantité et Somme.Comment mettre à jour la colonne sur un autre changement de colonne dans l'édition en ligne

Le type d'entrée html5 est utilisé.

Si la colonne Somme est modifiée en édition en ligne, la valeur de la colonne de prix doit calculé en utilisant la formule

Prix = Somme/Quantité;

J'ai essayé de mettre en œuvre ce modèle en utilisant jqGrid ci-dessous, mais il ne change pas la colonne des prix depuis input#Price et input#Quantity sont indéfinis.

Les ID d'élément sont créés à partir de l'ID de ligne et sont différents dans chaque ligne. Jqgrid ne transmet pas la valeur de l'ID de ligne pour changer l'événement.

Quelle est la meilleure pratique dans jqgrid libre pour implémenter de tels calculs?

var sumColumnTemplate = { 
    "editoptions": { 
     "type": "number", 
     "dataEvents":[{"type":"change","fn":function(e) { 
      $('input#Price').val(parseFloat(this.value)/parseFloat( 
       $('input#Quantity').val() )); 
     } 
     } 
}; 

élément inspectez Chrome montre que le balisage suivant est créé pour la ligne en mode d'édition en ligne:

<tr role="row" id="1383" tabindex="-1" class="ui-widget-content jqgrow ui-row-ltr" editable="1" aria-selected="false"> 
    ... lot of td s skipped 

    <td role="gridcell" style="text-align:right;" class="" title="4" aria-describedby="grid_Quantity"><input type="number" class="grid-decimal-edit editable" id="1383_Quantity" name="Quantity" cm="[object Object]" icol="5" role="textbox" style="width: 100%; box-sizing: border-box;"></td> 

    <td role="gridcell" style="text-align:right;" class="" 
    aria-describedby="grid_Price"><input type="number" title="" maxlength="15" class="grid-decimal-edit editable" id="1383_Price" name="Price" cm="[object Object]" icol="6" role="textbox" style="width: 100%; box-sizing: border-box;"></td> 

    <td role="gridcell" style="text-align:right;" title="" aria-describedby="grid_Sum"><input type="number" title="" maxlength="15" class="grid-decimal-edit editable" id="1383_Sum" name="Sum" cm="[object Object]" icol="7" role="textbox" style="width: 100%; box-sizing: border-box;"></td> 
    .... 
</tr> 
tableau

a plusieurs lignes et 1383 dans une partie de id est la ligne probablement nombre qui est différent pour chaque ligne .

Quelle est la meilleure façon d'obtenir des valeurs numériques de la ligne courante en mode édition en ligne?

Bootstrap 3, jquery, jquery-ui, ASP.NET MVC 4, vues rasoir, .NET 4.6 sont utilisés.

Mise à jour

définitions de colonne:

{"label":"Quantity","name":"Quantity","index":"Quantity","searchoptions":{"sopt":["eq","ne","lt","le","gt","ge"],"maxlength":12,"size":12},"template":"number","formatoptions":{"thousandsSeparator":"","decimalPlaces":4,"defaultValue":""},"align":"right","editoptions":{"type":"number","step":"any","min":-999999,"max":9999999,"title":"","maxlength":12,"dataEvents":[{"type":"change","fn":function(e) {dataChanged(e.target)} 
},{"type":"focus","fn":function(e) {if(typeof e.target.ischanged=='undefined') {e.target.ischanged=false}} 
},{"type":"blur","fn":function(e) {} 
}],"readonly":null,"class":"grid-decimal-edit","disabled":null},"editable":function(options){return getEditable(options,false);} 
,"width":68,"classes":"","hidden":false}, 

{"label":"OstuPrice","name":"Price","index":"Price","searchoptions":{"sopt":["eq","ne","lt","le","gt","ge"],"maxlength":15,"size":15},"template":"number","formatoptions":{"thousandsSeparator":"","decimalPlaces":5,"defaultValue":""},"align":"right","editoptions":{"type":"number","step":"any","min":-99999999,"max":999999999,"title":"","maxlength":15,"dataEvents":[{"type":"change","fn":function(e) {dataChanged(e.target)} 
},{"type":"focus","fn":function(e) {if(typeof e.target.ischanged=='undefined') {e.target.ischanged=false}} 
},{"type":"blur","fn":function(e) {} 
}],"readonly":null,"class":"grid-decimal-edit","disabled":null},"editable":function(options){return getEditable(options,false);} 
,"width":75,"classes":"","hidden":false,"tere":"1234"}, 

{"template":sumColumnTemplate 
,"label":"Sum","name":"Sum","width":80,"index":"Sum","hidden":false}, 
+0

Pouvez-vous poster la définition des colonnes 'Price' et' Quantity' et probablement une autre colonne où 'sumColumnTemplate' est nous ed? Je vois en plus des attributs 'cm' et' icol', qui ne devraient pas exister dans la version courante (4.13.4) de jqGrid libre. Quelle version utilisez-vous? – Oleg

+0

J'utilise 4.13.3-pre. J'ai résolu le problème en utilisant '$ ('input [Name =" Price "]')' et '$ ('input [Name =" Quantity "]')' sélecteurs. Est-ce la meilleure pratique? À l'avenir, d'autres calculs utilisant des colonnes différentes seront mis en œuvre. – Andrus

+0

@Oleg. Les variables cm et icol sont utilisées dans le code. Comment jqgrid convertit ces variables en attributs de colonne? – Andrus

Répondre

2

Le problème existe parce que vous utilisez template propriété avec l'objet en tant que valeur. À partir de jqGrid 4.7 (voir my old pull request), il est possible de définir des templates "standard" et de les utiliser comme des chaînes.

Un besoin d'utiliser le code suivant pour définir

$.jgrid = $.jgrid || {}; 
$.jgrid.cmTemplate = $.jgrid.cmTemplate || {}; 
$.jgrid.cmTemplate.mySum = { 
    editoptions: { 
     type: "number", 
     dataEvents: [{ 
      type: "change", 
      fn: function(e) { 
       // some code 
      } 
     }] 
    } 
}; 

On peut maintenant utiliser template: "mySum":

{"template":"mySum","label":"Sum","name":"Sum","width":80} 

au lieu de template: sumColumnTemplate:

{"template":sumColumnTemplate,"label":"Sum","name":"Sum","width":80, 
"index":"Sum","hidden":false} 
+0

Pourquoi' template: "mySum" 'est meilleur que' template: sumColumnTemplate'? Ils procèdent exactement le même résultat par mySum nécessite également une affectation supplémentaire à cmTemplate. – Andrus

+0

@Andrus: 'template:" mySum "' contient la valeur ** string **, qui peut être sérialisée/désérialisée via JSON. Ainsi, vous pouvez charger ce 'colModel' depuis le serveur via JSON. De l'autre côté 'template: sumColumnTemplate' contient ** functions ** dans l'objet et ne peut pas être utilisé dans les données JSON. – Oleg

+0

L'ID de ligne doit-il être déterminé dans l'événement de modification pour les calculs? Si oui, quelle est la meilleure pratique pour le trouver? '$ (this) .closest ('tr')'? – Andrus