2012-06-10 50 views
1

我需要帮助做关于使用过滤器工具栏下拉jqGrid的数据范围选择选择 - 我检查了SOPT选择它只有 -的jqGrid:工具栏的搜索选项 - 范围从下拉

['equal','not equal', 'less', 'less or equal','greater','greater or equal', 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain'] 

和我我无法找到关于如何在工具栏上使用这个范围的任何线索。我有一个下拉菜单,在我的过滤器工具栏上有"All", "1-4", "5-9"这样的值,当我选择'1-4'时,我希望网格填充所有落在该范围内的行。我查看了一堆来自stackoverflow和trirand本身的过滤器示例,但它们似乎都是用于搜索框的。 我很感激任何帮助来实现这一点,谢谢。

+0

您是否在服务器上使用本地过滤或过滤? – Oleg

+0

嗨奥列格,从现在的本地过滤,可能需要extedn这到服务器。我能够修改你的多字例子来做范围过滤。 –

+0

是的,我会建议你一样。来自[答案](http://stackoverflow.com/a/8953934/315935)的代码显示了如何将一个搜索规则替换为多个规则。使用该方法可以实现任何新的搜索规则。在服务器端搜索的情况下,实现更加容易。 – Oleg

回答

0

我能够通过基于样本多字样本-的范围来实现此过滤器。大部分代码都是从上面提到的示例中稍作更改。根据Oleg的反馈进行修改,使其成为le和ge。

modifySearchingFilter = function (separator) { 
      var i, rules, rule, parts, group, str; 
      var filters = $.parseJSON(this.p.postData.filters); 
      if(separator != '-') 
       return; 
      if (filters && typeof filters.rules !== 'undefined' && filters.rules.length > 0) { 
       rules = filters.rules; 
       for (i = 0; i < rules.length; i++) { 
        rule = rules[i]; 
        if (rule.op === 'range') { 
         // Range should only have 2 parts lowerbound and upperbound 
         parts = rule.data.split(separator); 
         if (parts.length == 2) { 
          if (typeof filters.groups === 'undefined') { 
            filters.groups = []; 
          } 
          group = { 
           groupOp: 'AND', 
           groups: [], 
           rules: [] 
          }; 
          filters.groups.push(group); 
          // Breaking to 2 rules one le and other ge 
          group.rules.push({ 
             data: (parts[0]), 
             op: "ge", 
             field: rule.field 
            });        
          group.rules.push({ 
             data: (parts[1]), 
             op: "le", 
             field: rule.field 
            });                  
          rules.splice(i, 1);  
          i--; // to skip i++        
         } 
        } 
       } 
       this.p.postData.filters = JSON.stringify(filters); 
      } 
     }, 


//using range op so that it is not confused with other ops 
setRangeSearchSelect = function(columnName) { 
     grid.jqGrid('setColProp', columnName, 
     { 
      stype: 'select', 
      searchoptions: {         value:buildRangeSearchSelect(), 
       sopt:['range'],        
     } 
    }); 
    }; 

grid.jqGrid('filterToolbar', 
    { 
    stringResult:true, 
    searchOnEnter:true,  
    defaultSearch:"cn", 
    beforeSearch: function() { 
     modifySearchingFilter.call(this, '-');  
    }}); 
+0

奇怪的是,您使用'op:“cn”'来实现范围。我认为正确的是一个部分是'ge'',第二个是'le''。 – Oleg

+0

是的你是对的。我开始使用op:“cn”。我会修改,谢谢 –

+0

欢迎您! – Oleg