【问题标题】:Ignore case while grouping分组时忽略大小写
【发布时间】:2013-04-15 12:13:56
【问题描述】:

有没有办法告诉 jqGrid 在分组时忽略大小写?我不想更改数据,因为有些是大写的,有些是小写的,有些是混合大小写的。

我正在使用 jqGrid 4.4.4

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    这个问题很好,但是 ... jqGrid 中的当前分组实现只允许分组 exact 值。我记得当有人想按月而不是按确切日期分组时,有严格的要求。

    在对 jqGrid 的源代码进行了一些分析之后,我希望我找到了一种非常简单且非常灵活的方式来进行更灵活的分组。建议修改the line

    if( typeof v !== "object" && grp.lastvalues[i] !== v ) {
    

    到

    if (typeof v !== "object" &&
            ($.isFunction(grp.isInTheSameGroup) ?
                !grp.isInTheSameGroup(grp.lastvalues[i], v) :
                grp.lastvalues[i] !== v)) {
    

    这之后可以在groupingView里面定义isInTheSameGroup函数:

    grouping: true,
    groupingView: {
        ...
        groupField: ["name"], // the column by which we group
        isInTheSameGroup: function (x, y) {
            return String(x).toLowerCase() === String(y).toLowerCase();
        }
    }
    

    The demo显示如下结果:

    我在jqGrid 4.4.5的jquery.jqGrid.src.js的demo修改版中使用过。 jqGrid 4.4.4 的jquery.jqGrid.src.js 的版本修改方式相同,你可以找到here。

    稍后我会将我的建议发布给 trirand。我希望 jqGrid 的下一个版本将包含该功能。

    已更新:按照承诺,我将 the corresponding feature request 发布到 trirand。

    更新 2:我发布了the pull request,对 jqGrid 的分组模块进行了一些更改。 The demo 演示如何使用新功能。它使用 2 级分组并显示以下结果:

    更新 3:我发送给 trirand 的 The pull request 现在已合并到 jqGrid 的主代码中。因此,jqGrid 的下一个版本(4.4.5 之后)将支持groupingView 内的isInTheSameGroup 和formatDisplayField 回调数组。如果你的情况看起来像

    groupingView: {
        groupField: ['name'],
        formatDisplayField: [
            function (displayValue) { //, value, cm, index, grp) {
                return String(displayValue).toLowerCase();
            }
        ],
        groupColumnShow: [true],
        groupDataSorted: true,
        isInTheSameGroup: [
            function (x, y) {
                return String(x).toLowerCase() === String(y).toLowerCase();
            }
        ]
    }
    

    回调isInTheSameGroup[0] 和formatDisplayField[0] 将按groupField[0] 分组使用。因为 jqGrid 支持多级分组,isInTheSameGrou 和 formatDisplayField 属性是回调函数数组,而不仅仅是回调函数。

    在开始分组jqGrid排序数据按分组列。可以使用定义为函数的sorttype 来自定义第一步(参见the answer)。我不知道在写你的答案过程中的步骤。可能使用sorttype: function (cellvalue) {return String(cellvalue).toLowerCase();} 已经可以解决您的问题。

    然后将使用函数isInTheSameGroup[level] 将前一行的分组列的值与当前行的相应值进行比较。将使用这些值调用函数 isInTheSameGroup[level]。如果您的回调返回true,则该行将与上一行分组。

    回调formatDisplayField[level] 允许自定义分组标题中显示的信息。在上面的示例中,我将数据转换为小写。

    【讨论】:

    • Oleg,非常感谢您的详细回复和功能请求。我不喜欢分叉代码,因为它变得很难更新到新版本。因此,我通过添加另一个带有大写数据的隐藏列并按该列分组来解决问题。
    • @JonasStawski:不客气!我了解您的解决方法和您的观点。尽管如此,我认为这个问题很常见。我之前建议了许多现在是 jqGrid 的一部分的功能,它可以帮助其他人。我希望 Tony (trirand) 能够实现我建议的功能(无论是以我建议的方式还是以其他方式实现都没有关系)。
    • 我同意。希望它确实如此,我不必分叉它,我可以删除我的黑客
    • @JonasStawski:github 上 jqGrid 的代码现在已更改为允许非常灵活的分组。请参阅我的答案的 UPDATE 2 和 UPDATE 3 部分。此外,我建议您查看the answer。使用sorttype 定义为函数的技巧可能对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多