2010-06-16 3 views
4

Je cherche la meilleure façon de permettre aux utilisateurs de choisir d'afficher TOUS les enregistrements dans un jqGrid. Je sais qu'une valeur -1 passée pour le paramètre rows indique ALL, mais je veux que le mot "ALL" ne soit pas -1 dans l'élément rowList select, ie. rowList: [15, 50, 100, 'ALL'].Meilleure façon de changer jqGrid rowNum de ALL à -1 avant de passer à un service Web

Je passe la requête de grille à un service Web qui accepte un int pour "rows", et j'essaie de trouver comment et quand je devrais changer la valeur sélectionnée par l'utilisateur de "ALL" à -1 avant que est envoyé au service Web.

Voici le code maillé nettoyé. J'ai essayé quelques différents blocs de code avant mon $ .ajax dans la fonction de type de données. Mais la plupart des tentatives semblaient juste que je devais le faire de la manière la plus alambiquée que je pourrais. Par exemple,

datatype: function(postdata) { 
    if ($("#gridTableAssets").jqGrid('getGridParam', 'rowNum') == 'ALL') { 
     $("#gridTableAssets").appendPostData({ "rows": -1, "page": 1 }); 
    } 
    $.ajax({... 

Mais faire cela semblait faire la « page » réelle GridParam à Nulled sur les actions de grille suivantes, me forçant poignée dans d'autres endroits. Il semble juste que c'est quelque chose qui serait souvent fait là-bas et avoir une façon propre de le faire.

code réseau Nettoyé:

$("#gridTableAssets").jqGrid({ 
    datatype: function(postdata) { 
     $.ajax({ 
      url: "/Service/Repository.asmx/GetAssets", 
      data: JSON.stringify(postdata), 
      type: 'POST', 
      contentType: "application/json; charset=utf-8", 
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
       alert('error'); 
      }, 
      success: function(msg) { 
       var assetsGrid = $("#gridTableAssets")[0]; 
       assetsGrid.addJSONData(JSON.parse(msg)); 
       ... 
      } 
     }); 
    }, 
    ... 
    pager: $('#pagerAssets'), 
    rowNum: 15, 
    rowList: [15, 50, 100, 'ALL'], 
    ...      
    onPaging: function(index, colindex, sortorder) { 
     SessionKeepAlive(); 
    } 
}); 

Et voici le service Web

[WebMethod] 
public string GetAssetsOfAssetStructure(bool _search, int rows, int page, 
    string sidx, string sord, string filters) 

Répondre

4

Tout d'abord je trouve votre question très bonne. Comme j'ai commencé avec jqGrid je cherchais "Tous" dans le rowList et fait quelques expériences, mais sans succès. Puis j'ai oublié ce problème. Maintenant, après votre question, je pense à utiliser cette fonctionnalité dans tous mes jqGrids.

Maintenant à propos de la solution. C'est très facile, mais avant tout, je suggère de remplacer datatype par la fonction datatype: 'json'. Tout ce que vous faites à l'intérieur de la fonction que vous pouvez faire avec le type standard 'json'. Pour changer contentType à "application/json; charset=utf-8" on peut utiliser l'option ajaxGridOptions (voir Setting the content-type of requests performed by jQuery jqGrid pour les détails). On peut utiliser le paramètre postData en remplacement du paramètre data de jQuery.ajax, mais vous en aurez besoin seulement si vous voulez envoyer des paramètres supplémentaires au serveur (comme décrit dans How to filter the jqGrid data NOT using the built in search/filter box). A la fin, nous recevons quelque chose comme ce qui suit:

$("#gridTableAssets").jqGrid({ 
    datatype: 'json', 
    gridview: true, 
    url: '/Service/Repository.asmx/GetAssets', 
    //postData: postdata, // add some additional parameters 
    ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, 
    mtype: 'POST', 
    // ... 
    pager: $('#pagerAssets'), 
    rowNum: 15, 
    rowList: [15, 50, 100, 'ALL'], 
    serializeGridData: function (postData) { 
     if (typeof postData.rows === "string") { // "ALL" 
      postData.rows = 10000; // or -1 if your server 
     } 
     if (isNaN(postData.page)) { // fix NaN in page for rows="ALL" 
      postData.page = 1; 
     } 
     return JSON.stringify(postData); 
    }, 
    // ...      
}); 

Si vous prévoyez d'utiliser serializeGridData, ajaxGridOptions et d'autres paramètres dans tous vos jqGrids vous pouvez définir cette fonction à l'intérieur de $.jgrid.defaults (voir une fois de plus Setting the content-type of requests performed by jQuery jqGrid).

+0

Oleg, merci pour les idées. J'ai été capable d'incorporer certaines choses dans ma fonction de type de données pour que cela fonctionne pour moi. J'aimerais quitter la fonction de type de données, mais continuer à courir dans le même problème quand j'essaye. Je vais essayer d'expliquer mon problème dans un commentaire ou deux, peut-être qu'il y a une solution évidente. Tout d'abord, j'essaie tout avec 3.6.4 et 3.7.1. Mon problème consiste à remplir la grille avec les données renvoyées lorsque vous n'utilisez pas la fonction de type de données. (Suite dans le commentaire suivant ...) – Billyhole

+0

Le service Web renvoie les données dans les deux sens mais ne remplit la grille que si dans ma fonction de type de données, j'ajoute une fonction de filtre de données pour supprimer la propriété d. var msg = JSON.parse (données); if (msg.hasOwnProperty ('d')) renvoie le message msg.d; - J'ai essayé de jouer avec mon tableau jsonReader, mais je n'arrivais toujours pas à l'obtenir.Mon format de données json revenant est {"d": "{" Total ": nnn," Page ": nnn," Enregistrements ": nnn," Lignes ": [{" STANDARDASSETID ": nnnn," field1 ":" xxxxx "," field2 ":" yyyy "}]," UserData ": zzzz}"} ---- Et mon jsonReader est {root: "Rows", page: "Page", total: "Total", records : "Records", repeatitems: false, userdata: "UserData", id: "Id"} – Billyhole

+0

Il semble que vous fassiez quelque chose de mal dans votre service Web. Pourriez-vous mieux ouvrir une nouvelle question et publier un code de votre WebMethod à l'intérieur. Je vais changer le code de sorte que les données principales ne seront pas sérialisées deux fois. – Oleg

Questions connexes