Je souhaite que les utilisateurs puissent filtrer les données de la grille sans utiliser le champ de recherche intrinsèque.
J'ai créé deux champs d'entrée pour la date (de et à) et je dois maintenant indiquer à la grille de l'adopter en tant que filtre puis de demander de nouvelles données.
Forger une demande de serveur pour les données de grille (en contournant la grille) et définir les données de la grille pour que les données de réponse ne fonctionnent pas - car dès que l'utilisateur tente de réorganiser les résultats ou de changer de page, etc. du serveur en utilisant un filtre vierge.
Je n'arrive pas à trouver l'API de grille pour y parvenir - quelqu'un a-t-il des idées? Merci.
Votre problème peut être très facilement résolu en respectant le paramètre postData
, y compris les fonctions et trigger('reloadGrid')
. J'essaie d'expliquer l'idée plus en détail.
Utilisons mtype: "GET"
. La seule chose que la boîte de recherche/filtre standard fait après l'affichage de l'interface est l'ajout de certains paramètres supplémentaires à l'URL, l'envoi au serveur et le rechargement des données de la grille. Si vous avez votre propre interface pour la recherche/le filtrage (certains contrôles sélectionnés ou cases à cocher, par exemple), vous devez simplement ajouter votre url vous-même et recharger la grille en respectant trigger('reloadGrid')
. Pour réinitialiser les informations dans la grille, vous pouvez choisir le moyen que vous préférez. Par exemple, vous pouvez inclure dans les contrôles de sélection une option du type "pas de filtrage".
Pour être plus précis, votre code devrait ressembler à celui de la réponse comment recharger jqgrid dans asp.net mvc lorsque je change de liste déroulante :
var myGrid = jQuery("#list").jqGrid({
url: gridDataUrl,
postData: {
StateId: function() { return jQuery("#StateId option:selected").val(); },
CityId: function() { return jQuery("#CityId option:selected").val(); },
hospname: function() { return jQuery("#HospitalName").val(); }
}
// ...
});
//
var myReload = function() {
myGrid.trigger('reloadGrid');
};
var keyupHandler = function (e,refreshFunction,obj) {
var keyCode = e.keyCode || e.which;
if (keyCode === 33 /*page up*/|| keyCode === 34 /*page down*/||
keyCode === 35 /*end*/|| keyCode === 36 /*home*/||
keyCode === 38 /*up arrow*/|| keyCode === 40 /*down arrow*/) {
if (typeof refreshFunction === "function") {
refreshFunction(obj);
}
}
};
// ...
$("#StateId").change(myReload).keyup(function (e) {
keyupHandler(e,myReload,this);
});
$("#CityId").change(myReload).keyup(function (e) {
keyupHandler(e,myReload,this);
});
Si l'utilisateur modifie l'option sélectionnée dans la zone de sélection avec id=StateId
ou une autre zone de sélection avec id=CityId
(avec la souris ou le clavier), la fonction myReload
sera appelée, ce qui forcera simplement le rechargement de données dans jqGrid. Au cours de la demande $.ajax
correspondante, ce que jqGrid fait pour nous, la valeur du paramètre postData
sera transmise à $.ajax
en tant que paramètre data
. Si certaines des propriétés de data
sont des fonctions, celles-ci seront appelées par $.ajax
. Ainsi, les données réelles des boîtes de sélection seront chargées et toutes les données seront ajoutées aux données envoyées au serveur. Vous devez uniquement implémenter la lecture de ces paramètres dans votre partie serveur.
Ainsi, les données du paramètre postData
seront ajoutées à l'URL (les symboles '?' Et '&' seront ajoutés automatiquement et tous les symboles spéciaux, tels que les blancs, seront également codés comme d'habitude). Les avantages de l'utilisation de postData
sont les suivants:
postData
vous permet de charger les valeurs réelles de tous les contrôles utilisés jusqu'au moment du rechargement;Si vous utilisez des entrées "aucun filtrage" ou "toutes" dans la liste de sélection StateId
, vous pouvez modifier la fonction qui calcule la valeur du paramètre StateId
qui doit être ajouté à l'URL du serveur à partir de
StateId: function() { return jQuery("#StateId option:selected").val(); }
à quelque chose comme suit:
StateId: function() {
var val = jQuery("#StateId option:selected").val();
return val === "all"? "": val;
}
Du côté du serveur, vous ne devriez pas filtrer pour StateId
si vous recevez une valeur vide en tant que paramètre.
Vous pouvez éventuellement utiliser myGrid.setCaption('A text');
pour modifier le titre de la grille. Cela permet à l'utilisateur de voir plus clairement que les données de la grille sont filtrées avec certains critères.
J'avais les mêmes exigences et (avec l'aide d'Oleg), j'ai eu ceci:
Fondamentalement, l'utilisateur commence à taper dans la zone de texte "Nom de l'employé", et immédiatement les résultats sont affichés dans jqGrid.
Les détails de la façon dont j'ai implémenté ceci sont ici:
Notez que je charge spécifiquement all des données JSON pour mon jqGrid in advance, et que pour les grands ensembles de données, il y a un délai lors de l'exécution de ce code sur un périphérique iPhone/Android lorsque vous tapez chaque caractère .
Mais, pour les applications Web de bureau, c'est une excellente solution et rend jqGrid beaucoup plus convivial pour l'utilisateur.
En utilisant les fonctions ReloadGrid()
et jquery
, vous pouvez créer vos propres fonctions de filtrage personnalisées.