Comment filtrer les données jqGrid sans utiliser la boîte de recherche/filtre intégrée

je veux que les utilisateurs puissent filtrer les données de la grille sans utiliser la boîte de recherche intrinsèque.

j'ai créé deux champs d'entrée pour date (from et to) et j'ai maintenant besoin de dire à la grille d'adopter ceci comme son filtre et ensuite de demander de nouvelles données.

forger une demande de serveur pour les données de grille (contourner la grille) et de définir les données de la grille pour être la réponse données ne fonctionnera pas - parce que dès que l'utilisateur essaie de Ré-ordonner les résultats ou de changer la page etc. la grille demandera de nouvelles données au serveur en utilisant un filtre blanc.

Je n'arrive pas à trouver L'API grid pour y parvenir - quelqu'un a-t-il une idée? Grâce.

57
demandé sur Jimbo 2010-05-28 14:58:29

3 réponses

votre problème peut être très facilement résolu avec le respect de postData paramètre y compris les fonctions et trigger('reloadGrid') . J'essaie d'expliquer l'idée plus détaillée.

utilisons mtype: "GET" . La seule chose que la recherche standard/boîte de filtre fait après avoir affiché l'interface est l'ajout de quelques 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 / filtrage (certaines commandes select ou des cases à cocher), par exemple) vous devriez juste ajouter votre url vous-même et recharger la grille avec le respect de trigger('reloadGrid') . Pour la réinitialisation des informations dans la grille, vous pouvez choisir n'importe quel moyen que vous préférez. Par exemple, vous pouvez inclure dans les contrôles select une option comme "No filtering".

pour être plus exact votre code devrait ressembler au code de la réponse comment recharger jqgrid en asp.net mvc when i change dropdownlist :

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 change l'option sélectionnée dans la boîte de sélection avec id=StateId ou une autre boîte de sélection avec id=CityId (avec la souris ou le clavier), la fonction myReload sera appelée, ce qui force juste le rechargement des données dans jqGrid. Pendant la requête $.ajax correspondante, ce que jqGrid fait pour nous, la valeur du paramètre postData sera transmise à $.ajax comme paramètre data . Si certaines des propriétés de data sont des fonctions, ces fonctions sera appelé par $.ajax . Ainsi les données réelles des boîtes de sélection seront chargées et toutes les données seront annexées aux données envoyées au serveur. Vous n'avez besoin que d'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 (symboles '?'et '&' sera ajouté automatiquement et tous les symboles spéciaux comme les blancs seront également codée comme d'habitude). Les avantages de l'utilisation de postData est:

  1. utilisation des fonctions paramètre" intérieur postData permet de charger valeurs réelles de tous les contrôles utilisés au moment du rechargement;
  2. votre code stay a une structure très claire.
  3. Tout fonctionne très bien, non seulement avec les requêtes HTTP GET, mais avec HTTP POST aussi;

si vous utilisez certaines entrées" no filtering "ou" all " dans la boîte de sélection StateId , vous pouvez modifier la fonction qui calcule la valeur du paramètre StateId qui devrait être ajouté à l'url du serveur de

StateId: function() { return jQuery("#StateId option:selected").val(); }

à quelque chose comme:

StateId: function() {
    var val = jQuery("#StateId option:selected").val();
    return val === "all"? "": val;
}

du côté du serveur, vous ne devez pas faire de filtrage pour StateId si vous recevez une valeur vide comme paramètre.

vous pouvez utiliser myGrid.setCaption('A text'); pour changer le titre d'une grille. Cela permettra à l'utilisateur d' pour voir plus clair, que les données dans la grille sont filtrées avec certains critères.

78
répondu Oleg 2017-05-23 12:10:15

j'ai eu les mêmes exigences, et (avec L'aide D'Oleg) est venu avec ceci:

enter image description here

fondamentalement, l'utilisateur commence à taper dans la zone de texte "Nom de L'employé", et immédiatement les résultats s'affichent dans le jqGrid.

les détails de la façon dont j'ai mis en œuvre ce sont ici:

jqGrid de Changement de filtre/de recherche pop-up forme du plat sur page pas un dialogue

Notez que je charger spécifiquement tous des données JSON pour mon jqGrid à l'avance , et que pour de grands ensembles de données, il y a un retard lors de l'exécution de ce code sur un iPhone ou un appareil Android comme vous le type de chaque personnage.

mais, pour les applications Web de bureau, c'est une excellente solution, et rend jqGrid beaucoup plus amical pour l'utilisateur.

2
répondu Mike Gledhill 2017-05-23 11:54:07

en utilisant les fonctions ReloadGrid() et jquery vous pouvez créer vos propres fonctions de filtrage personnalisées.

0
répondu 신유진 2017-02-17 07:21:59