J'ai besoin de l'aide de sme pour automatiser les filtres jqGrid, s'il vous plaît

D'accord, en un mot, ce que je dois faire, c'est d'appliquer automatiquement un ensemble de critères de tri et de filtres de données au jqGrid lorsqu'il est chargé. L'intention est que l'utilisateur commencera avec environ 10 filtres pré-remplis et, s'ils le choisissent, ils peuvent modifier ces filtres ou le tri, mais ils le jugent bon.

Jusqu'à présent, avec beaucoup de google, d'essai et d'erreur et de sueur, j'ai le travail suivant:

-> Je peux charger / enregistrer la colonne de tri et l'ordre de tri dans un cookie de session.

-> Je peux charger la boîte de dialogue de recherche avec des filtres de recherche prédéfinis. Après la grille, je peux ouvrir la boîte de dialogue modale et voir les filtres appropriés et si je clique sur "Trouver", les données appropriées sont affichées sur le serveur et les résultats corrects sont retournés à l'écran.

Ce qui me mordit dans le bout maintenant, c'est, je pense, la partie facile, mais ça m'échappe. Je ne peux pas faire l'une des choses suivantes:

(A) La chose idéale serait si je pouvais attacher ces filtres à la grille et c'est la publication des données avant la charge initiale afin qu'il n'y ait qu'un seul voyage sur le serveur.

(B) La solution viable, bien que moins idéale, serait que la grille chargerait d'abord la première page des données non filtrées, puis appliquez les filtres et ré-interrogez le serveur pour les données filtrées.

Puisque je peux cliquer manuellement sur le bouton "trouver" aujourd'hui et cela fonctionne, je pensais que "B" serait une bonne étape suivante. Donc, dans ma fonction gridComplete, j'ai le code suivant:

$('#AccountGrid').clearFilter({gridName:'AccountGrid', pagerName:'AccountPager'}); $('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:1, op:'ne'}); $('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:3, op:'ne'}); // $('#fbox_AccountGrid').searchFilter().search(); // $('#fbox_AccountGrid .ui-search').click(); $('#AccountGrid').trigger('reloadGrid'); NOTE: "clearFilter" and "addFilter" are extension functions I have added to jqGrid to simplify adding and removing filters on the grid. They work exactly as desired at this point. As you can see with those last three lines of code, I have tried using the built-in function, as well as going after the find button directly and even just forcing the entire grid to refresh. Either way, there is no attempt by the grid to go get new data (I am using Fiddler to watch for it). What am I doing wrong in trying to force the grid to reload with the new filters? And, if you know how, can you give me some direction on how to get the initial load of the grid to respect these filters? TIA Tony Here is the full grid configuration (minus the extra columns and some colModel "cruft"): jQuery('#AccountGrid').jqGrid({ url: '<my URL>', width: 950, height: 330, shrinkToFit: 'true', datatype: 'json', mtype: 'POST', multiselect: true, multiboxonly: true, multiselectWidth: 20, colNames: [ 'Account ID' ], colModel: [ { name: 'AccountID', index: 'AccountID', sortable: false, hidden:false, search:true } ], gridComplete: function () { // add the search criteria to the grid if (initialLoad == true){ $('#AccountGrid').clearFilter({gridName:'AccountGrid', pagerName:'AccountPager'}); $('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:1, op:'ne'}); $('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:3, op:'ne'}); // $('#fbox_AccountGrid').searchFilter().search(); // $('#fbox_AccountGrid .ui-search').click(); $('#AccountGrid').trigger('reloadGrid'); initialLoad = false; } }, jsonReader: { repeatitems: false, id: 'AccountID' }, pager: jQuery('#AccountPager'), rowNum: 50, rowList: [10, 15, 25, 50, 75, 100], onSortCol : function (sortname, indexColumn, sortorder){ $.cookie('AccountGrid_sortname', sortname); $.cookie('AccountGrid_sortorder' , sortorder); }, sortname : $.cookie('AccountGrid_sortname') ? $.cookie('AccountGrid_sortname') : 'AccountID', sortorder: $.cookie('AccountGrid_sortorder') ? $.cookie('AccountGrid_sortorder') : 'asc', viewrecords: true, imgpath: '' }); $('#AccountGrid').jqGrid('navGrid','#AccountPager', { view: false, add: false, edit: true, del: false, alertcap:'No Account Selected', alerttext: 'Please select an Account from the grid before performing this operation.', editfunc: showAccountEditDialog }, {}, // default settings for edit {}, // default settings for add {}, // delete {closeOnEscape: true, multipleSearch: true, closeAfterSearch: true }, // search options {} ); 

Et, sur demande, voici le code que j'ai pour ajouter / effacer le filtre:

 /* This is a grid extension function that will insert a new filter criteria on the specified grid with the provided field, operation & data values */ (function ($) { jQuery.jgrid.addSearchFilter = { // get/set the parameters addFilter: function (options) { var grid = $(this); // get offset values or assign defaults var settings = $.extend({ gridName: '', field: '', data: '', op: '' }, options || {}); // get the column model object from the grid that matches the provided name var colModel = grid.getGridParam('colModel'); var column; for (var i = 0; i < colModel.length; i++) { if (colModel[i].name == options.field){ column = colModel[i]; break; } } colModel = null; if (column){ // if the last filter has a value, we need to create a new one and not overwrite the existing ones if ($('#fbox_' + options.gridName + ' .sf .data input').last().val()){ $('#fbox_' + options.gridName).searchFilter().add(); } // assign the selections to the search dialog $('#fbox_' + options.gridName + ' .sf .fields select.field').last().val(column.index).change(); $('#fbox_' + options.gridName + ' .sf .data input').last().val(options.data); $('#fbox_' + options.gridName + ' .sf .ops select.default').last().val(options.op).change(); } } } })(jQuery); jQuery.fn.extend({ addFilter: jQuery.jgrid.addSearchFilter.addFilter }); /* This is a grid extension function that will clear & reset the filter criteria */ (function ($) { jQuery.jgrid.clearSearchFilter = { // get/set the parameters clearFilter: function (options) { var grid = $(this); // get offset values or assign defaults var settings = $.extend({ gridName: '', pagerName: '' }, options || {}); // clear the filters and "pop" the dialog to force the HTML rendering $('#fbox_' + options.gridName).searchFilter().reset(); $('#' + options.pagerName + ' .ui-icon-search').click(); $('#fbox_' + options.gridName).searchFilter().close(); } } })(jQuery); jQuery.fn.extend({ clearFilter: jQuery.jgrid.clearSearchFilter.clearFilter }); 

Tout d'abord parce que vous ne publiez pas le code qui définit le jqGrid, je fais moi même une hypothèse. J'essaie de me baser sur des informations indirectes de votre question.

1) Je suppose que vous utilisez le paramètre de datatype côté serveur de jqGrid comme 'json' ou 'xml'. 2) Vous n'utilisez pas loadonce:true paramètre. En général, s'il serait possible de faire loadonce:true le serveur de la grille ayant loadonce:true , mais dans le cas où vous devez réinitialiser la valeur du paramètre de datatype de datatype à la valeur initiale (une de la valeur 'json' ou 'xml').

Les trois anciennes réponses suivantes: ceci (en cas de recherche de valeur unique ) et ceci (en cas de recherche avancée ou la recherche de la barre d'outils avec un paramètre supplémentaire stringResult:true ) vous donnera suffisamment d'informations sur le réglage des filtres de recherche et le rechargement de la grille correspond à Les nouveaux filtres. Une autre réponse montre comment effacer le filtre de recherche s'il n'est plus nécessaire.

Le chargement de la grille à la première fois avec les filtres est une autre question. Il peut être très facile à mettre en œuvre. Vous devriez simplement utiliser le datatype:"local" au lieu du datatype:"json" de datatype:"json" ou datatype:"xml" dont vous avez vraiment besoin. Dans le cas, le paramètre url de jqGrid sera simplement ignoré lors de la première charge et jqGrid n'envoie aucune demande au serveur. Ensuite, vous définissez les filtres comme vous selon le besoin et seulement alors utilisez $("#youGridId").trigger("reloadGrid");

La raison pour laquelle le reloadGrid n'a pas fonctionné dans votre cas, je ne pouvais pas savoir exactement, mais je suppose que vous n'avez pas configuré la search:true paramètre search:true du jqGrid auquel on confond fréquemment avec la propriété postData paramètre postData (voir ici ).