2011-02-09 10 views
5

Okay, więc w skrócie, co muszę zrobić, to automatycznie zastosować zestaw kryteriów sortowania i filtrów danych do jqGrid podczas ładowania. Chodzi o to, że użytkownik rozpocznie od około 10 wstępnie wypełnionych filtrów, a następnie, jeśli tak zdecydują, może zmienić te filtry lub sortowanie według własnego uznania.Potrzebuję sme pomóc automatyzacji filtrów jqGrid, proszę

tej pory z wielkim Google-ing, metodą prób i błędów, a potem, mam następujący robocza:

-> mogę załadować/zapisać sortowania kolumna & porządek w pliku cookie sesji.

-> Mogę wczytać okno wyszukiwania ze wstępnie zdefiniowanymi filtrami wyszukiwania. Po załadowaniu siatki mogę otworzyć modalne okno dialogowe i zobaczyć odpowiednie filtry, a jeśli kliknę "Znajdź", odpowiednie dane zostaną wysłane na serwer, a odpowiednie wyniki zostaną zwrócone na ekran.

To, co mnie teraz gryzie w tyłek, jest, jak sądzę, częścią łatwą, ale mi to wymyka. Nie mogę wykonać jednej z poniższych czynności:

(A) Idealną rzeczą byłoby, gdybym mógł dołączyć te filtry do siatki i danych pocztowych przed początkowym załadowaniem, tak aby był tylko jeden wycieczka na serwer.

(B) Rozwiązaniem praktycznym, choć mniej idealnym, byłoby najpierw załadowanie pierwszej strony niefiltrowanych danych, a następnie zastosowanie filtrów i ponowne zapytanie serwera o przefiltrowane dane.

Ponieważ mogę ręcznie kliknąć przycisk "znajdź" już dziś i działa, myślałem, że "B" będzie dobrym następnym krokiem. Tak więc, w mojej funkcji gridComplete, mam następujący kod:

$('#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 
     {} 
    ); 

, a co za wniosek, Oto kod mam dla ADD/Usuń filtry:

/* 
    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 }); 

Odpowiedz

4

przede wszystkim dlatego don 't opublikuj kod, który definiuje jqGrid. Zrobię pewne założenie. Próbuję opierać się na pośrednich informacjach z twojego pytania.

1) Przypuszczam, że używasz parametru po stronie serwera datatype jqGrid jak "json" lub "xml". 2) Nie używasz parametru loadonce:true. Zasadniczo, jeśli byłoby możliwe ponowne załadowanie serwera z sieci mającej loadonce:true, ale w przypadku, gdy konieczne jest zresetowanie wartości parametru datatype do wartości początkowej (jedna z wartości "json" lub "xml").

Poniższe trzy stare odpowiedź: this (w przypadku single value searching) i this (w przypadku advanced searching lub the toolbar searching z dodatkowym parametrem stringResult:true) daje wystarczająco dużo informacji na temat ustawiania filtrów wyszukiwania i przeładowywania siatki odpowiada nowych filtrów . Another answer pokazuje, jak wyczyścić filtr wyszukiwania, jeśli nie jest już potrzebny.

Ładowanie siatki po raz pierwszy z filtrami to kolejne pytanie. To może być bardzo łatwe wdrożenie. Powinieneś po prostu użyć datatype:"local" zamiast datatype:"json" lub datatype:"xml", których naprawdę potrzebujesz. W przypadku, gdy parametr jqGrid zostanie zmieniony na url po prostu zostanie zignorowany przy pierwszym załadowaniu, a jqGrid nie wyśle ​​żadnego żądania do serwera.Następnie należy ustawić filtry jak ty jako konieczności i dopiero wtedy użyć $("#youGridId").trigger("reloadGrid");

Powodem reloadGrid nie działa w Twoim przypadku nie mogłem dokładnie wiedzieć, ale przypuszczam, że nie ustawić parametr search:true jqGrid, który często mylimy z wartością _search parametru(patrz here).

+0

Dzięki, Oleg. Dodałem definicję siatki. Pierwotnie pominąłem go, ponieważ faktyczna funkcjonalność definiowania i przypisywania filtrów wyszukiwania działała poprawnie i jeśli klikniesz przycisk "znajdź" ręcznie, działają one zgodnie z oczekiwaniami, więc z tych informacji założyłem, że moja siatka została poprawnie skonfigurowana. Ale masz rację, powinienem to uwzględnić niezależnie. – Tony

+0

Niektóre z podanych przez ciebie linków widziałem, a niektóre nie. Jednak gdy patrzę na nie, koncentrują się na tym, jak uruchomić wyszukiwanie. Ta część, trudna część, już zrobiłem. To tylko ponowne załadowanie siatki i/lub wstępne załadowanie kryteriów wyszukiwania, których nie byłem w stanie przykuć. Twoja sugestia ustawienia typu danych, a następnie filtry i resetowanie typu danych jest interesująca. Dam ci to dziś rano. – Tony

+0

Próbowałem twojej sugestii, aby najpierw ustawić typ danych na "lokalny", a następnie zastosować filtry i przywrócić typ danych do "json", a następnie wywołać sieć przeładowania. Pierwszy problem polega na tym, że filtry nie są stosowane do siatki, gdy siatka znajduje się w tym trybie. Nie sprawdziłem jeszcze, ale albo nie można zastosować filtrów, gdy typ danych jest "lokalny", albo zmiana typu danych powoduje wyczyszczenie filtrów. Niezależnie od tego, drugi problem polega na tym, że kiedy używam Fiddlera do przeglądania żądań przeglądarki, siatka nigdy nie oddzwania do serwera w poszukiwaniu danych, nawet po ustawieniu typu danych na json i ponownym załadowaniu siatki. – Tony

Powiązane problemy