【问题标题】:How multiple column grouping can be done in slickgrid?如何在 slickgrid 中进行多列分组?
【发布时间】:2012-05-30 20:17:37
【问题描述】:

我是 slickgrid 的新手。我已经浏览了几个 slickgrid 的例子,并且对基础知识很好。我有一个场景,我需要基于多列进行分组,但 slickgrid 分组基于单列。

如何在 slickgrid 中对每个组进行展开和折叠功能的多列分组?

任何了解此解决方案的人,请以基本方式解释一下,因为我是 slickgrid 的新手。

我的要求就像在此链接slickgrid-grouping-example 中对行本身进行分组。此示例用于基于一列进行分组。我的要求是基于多列进行分组

【问题讨论】:

  • 我也在尝试进行多级分组。如何使用展开/折叠功能进行多级分组?

标签: grouping slickgrid expand


【解决方案1】:

我知道这个问题已经过时了,但不久前我实现了这个功能,并在我的名字下在 Github 上的 SlickGrid 项目队列中收到了一个拉取请求。您也许可以尝试一下并给我一些反馈。为此,我修改了 3 个文件,包括示例文件。在这一点上,我不知道我的提交是否会被接受,因此请自行承担风险,尽管我对我的解决方案非常有信心,因为我已经在工作中使用它。 这是它的链接:https://github.com/mleibman/SlickGrid/pull/522/files

这是一个 3 个多列分组的示例,此代码部分来自我也修改过的 example-grouping.html 文件。定义多个分组使用数组,与之前的实现非常相似,只是在定义多个分组时将其包装在数组中。

function groupByDurationPercentageStart() {
  dataView.groupBy(
    ["duration", "percentComplete", "start"],
    [
      (function (g) {
        return "Duration:  " + g.value + "  <span style='color:green'>(" + g.count + " items)</span>";
      }),
      (function (g) {
        return "Complete:  " + g.value + "  <span style='color:green'>(" + g.count + " items)</span>";
      }),
      (function (g) {
        return "Start Date:  " + g.value + "  <span style='color:green'>(" + g.count + " items)</span>";
      })
    ],
    [
      function (a, b) {
        return a.value - b.value;
      },
      function (a, b) {
        return a.value - b.value;
      },
      function (a, b) { // string sorting
        var x = a.value, y = b.value;
        return x == y ? 0 : (x > y ? 1 : -1);
      }
    ]
  ); 
  dataView.setAggregators([
    new Slick.Data.Aggregators.Avg("percentComplete"),
    new Slick.Data.Aggregators.Sum("cost")
  ], true, false);     
}

希望它对你们有帮助,现在它确实拥有所有功能,我喜欢这个网格 =)

【讨论】:

    【解决方案2】:

    我想您正在寻找这样的功能?

    http://bit.ly/JTlf0z 要么 http://bit.ly/KuncBU

    以上示例来自 ExtJS 网格和 jQuery.easyUI 插件。

    这似乎是目前 SlickGrid 中不可用的东西(我不是 SlickGrid 专业人士,这只是我从一些谷歌搜索中推断出来的)。您很可能必须自己编写代码。

    (当然,如果您不想切换到上述网格之一;)。

    挖掘源代码,找到它生成列和列标题的位置并开始处理它。您可以查看上面提到的其他网格以获取有关实现此功能的一些指导(关于使用的 HTML 标记和 CSS)。

    您很可能必须修改“列”数组的定义方式,以在列分组标题中包含数据。

    类似:

    var columns = [
      {title:'Group 1', columns:[
        {id: "field1", name: "Field 1", field: "field1"},
        {id: "field2", name: "Field 2", field: "field2"},
      ]},
      {id: "field3", name: "Field 3", field: "field3"},
      {title:'Group 2', columns:[
        {id: "field4", name: "Field 4", field: "field4"},
        {id: "field5", name: "Field 5", field: "field5"},
        {id: "field6", name: "Field 6", field: "field6"},
      ]}
    ];
    

    然后修改列生成代码以检查是否存在嵌套的“列”字段并使用它来生成列标题?

    只是一个想法:)。希望对您有所帮助。

    【讨论】:

    • 谢谢!我的要求就像在此链接slickgrid-grouping-example 中对行本身进行分组。此示例用于基于一列进行分组。我的要求是基于多列分组
    【解决方案3】:

    实际上,光滑的网格分组并不仅限于一列。
    查看 DataView API 的 groupBy 方法。它具有以下签名:

    function groupBy(valueGetter, valueFormatter, sortComparer){...}
    

    所以你感兴趣的是第一个参数。它可以是一个字符串,表示要分组的单个列名,也可以是一个函数。达达!
    长话短说,以下是如何按多个列进行分组:

      dataView.groupBy(
          //Grouping value
          function (row) {
              return row["groupColumn1"]+":"+row["groupColumn2"]+":"+row["groupColumn3"];
          },
          //Group display
          function (group) {
           var values = g.value.split(":", 3); //3 is number of grouping columns*
           return "Col1: "+values[0]+", Col2: "+values[1]+", Col3:" + values[2];
          },
          //Group comparator/sorting
          function (a, b) {
              return a.value - b.value;
          }
      );
    

    【讨论】:

    • 他想要分组而不是行分组。
    • idbehold,我很确定他想根据多列的值对行进行分组。他链接到的示例是根据一列中的值对行进行分组,而 AFAIK slickgrid 没有“列分组”之类的东西。定义网格本身时定义列顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2014-01-09
    相关资源
    最近更新 更多