【问题标题】:implement excel-like filter menus kendo jquery实现类似 excel 的过滤器菜单 kendo jquery
【发布时间】:2018-03-09 06:14:01
【问题描述】:

我正在为 Jquery 库使用 Kendo 网格 UI。

我需要使用网格的列过滤器菜单下拉复选框执行以下两件事:

1) 复选框按其值的字母顺序排序(默认情况下按网格的数据源排序值排序)。

2) 根据第一个复选框的过滤器选择过滤所有其他列的复选框值。

【问题讨论】:

  • 你有什么尝试吗?可以发一些代码吗?
  • $("#grid").kendoGrid({filterable: true, columns:[{field: Accountid,filterable:{multi: true,search:true}}], dataSource: { }, pageable: true });

标签: jquery kendo-ui kendo-grid


【解决方案1】:

这是一个排序和过滤的例子。您只需将可过滤和可排序添加到您的 kendoGrid 初始化。

    $("#grid").kendoGrid({
  dataSource: {

  }, 
  filterable: {
      extra: false,
      operators: {
          string: {
              startswith: "Starts with",
              eq: "Is equal to",
              neq: "Is not equal to"
          }
      }
  },
  sortable: {
    mode: "multiple",
    allowUnsort: true,
    showIndexes: true
},
  pageable: true


});

【讨论】:

  • 以上示例未在复选框中应用过滤器。我需要根据第一个复选框的过滤器选择来过滤所有其他列的复选框值。
【解决方案2】:

工作演示:https://codepen.io/ezanker/pen/PRwPLo

要对复选框进行排序,您可以使用 filterMenuInit event。将所有 LI 项放入一个数组并对其进行排序,然后将它们添加回 UL。在此示例中,我将 Select All 选项保留在第一个位置:

filterMenuInit: function(e) {
        var items = e.container.find("li").get();
        items.sort(function(a,b){
            var keyA = $(a).text();
            var keyB = $(b).text();

            if (keyA < keyB) return -1;
            if (keyA > keyB) return 1;
            return 0;
        });
        var ul = e.container.find("ul");
        $.each(items, function(i, li){
            if ($(li).find('.k-check-all').length > 0){
                ul.prepend(li); //keep select all first
            } else {
                ul.append(li); // This moves theli from the old spot
            }
        });
    }, //end filterMenuInit

要将一列中的过滤器选择应用于所有列,请使用 fiter event。在这里,我遍历其他列并为它们构建相同的过滤器。鉴于列过滤器是ANDed,只会返回具有相同值的行,即在示例中检查第一个列过滤器中的item1,并且只显示所有列都有item1的一行。如果您想要 OR,请将 thefilter.logic = "and"; 更改为 thefilter.logic = "or";

filter: function(e) {
    grid = e.sender;
    if (e.filter == null) {
        grid.dataSource.filter(null);                          
        grid.refresh();
        $("form.k-filter-menu button[type='reset']").trigger("click");                          
    } else {
        //build filters object for all fields
        var thefilter = {};
        thefilter.logic = "and";
        thefilter.filters = [];
        for (var i=0; i<colFields.length; i++){
            if (e.field == colFields[i]) continue;
            var colfilt = {"logic": e.filter.logic};
            var filters = [];
            for (var j=0; j<e.filter.filters.length; j++){
                var filt = {};
                filt.field = colFields[i];
                filt.operator = e.filter.filters[j].operator;
                filt.value = e.filter.filters[j].value;
                filters.push(filt);
            }
            colfilt.filters = filters;
            thefilter.filters.push(colfilt);
        }

        grid.dataSource.filter(thefilter);
    }
}//end filter

注意:清除一列中的过滤器不会清除其他列中的过滤器。你需要解决这个问题。

【讨论】:

  • 非常感谢您的回答。我尝试了上述方法。但是,问题是我正在为 jquery 使用 2016R2 kendo ui 版本。 .此版本的 kendo ui 没有 KendoGrid 的 Filter 事件。所以,我不能使用 Kendo Grid 的过滤器事件。基于第一个复选框的过滤器选择实现过滤所有其他列的复选框值的任何其他方式
  • 我已将我的剑道库升级到 2017 年,现在过滤器事件正在触发。但是,实际上我的要求是:- 1.] 如果我们过滤一列中的值,那么即使该行的值不同,也必须检查同一行对应列中的值。
  • @sai,尝试将整体过滤器的过滤逻辑改为“or”而不是“and”:thefilter.logic = “or”;
  • 我试过了,但还是不行。请找到我正在尝试的示例:- dojo.telerik.com/IJAGoWur/7
  • 即使我指定了filter.logic = "or",它仍然将整体过滤器设置为"and"
猜你喜欢
  • 2018-02-09
  • 2018-07-01
  • 2018-09-11
  • 1970-01-01
  • 2012-01-13
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
相关资源
最近更新 更多