【问题标题】:Jqgrid - grouping row level dataJqgrid - 对行级数据进行分组
【发布时间】:2012-08-25 09:39:35
【问题描述】:

使用 jqgrid,是否可以将行级数据分组为附加图像中的?基本上我想将特定行的数据从某些列开始分成多行..

例子

【问题讨论】:

  • 如果用户单击前一个小列上的任何图像,您是否希望“模块”列将被折叠(隐藏),然后如果用户愿意,该列将被展开(显示)下次点击小柱子的图片?
  • Oleg:非常感谢您的回复。你的意思是有一个加号,然后用户扩展它以显示子网格(子行)数据?这是一个想法,但我们的用户想要这样的东西。我们可以实现 jqgrid 附件中显示的内容吗?基本要求是能够将分组数据显示在一起,并将每个子数据显示为同一分组行的拆分行
  • 我的问题是因为我不明白你的问题。您能否准确解释您想要实现的网格的哪种行为?你只发布了一张图片,但没有解释它应该如何解释。您是想像在图片上一样在网格中显示数据,还是需要在单击网格内的某些位置时实现一些行为?有两列的红色框是什么意思?图标为方框(正方形)的小列是什么意思?
  • Oleg:假设我有 4 行数据(绿色框),在网格中显示不同的列。在这 4 行中,一些列(在上图中 - 四行的区域、国家、位置、设备相同,但其余列数据不同)。我只是在问我们是否可以像在图像中那样显示这些数据,例如将相同的数据分组在一行中,但将未分组的行拆分为不同的行。红色框表示每个分组行的单独列级数据
  • 我添加了另一个示例以更好地理解我的要求。例如,如果您在一个州有不同的地方,并且您想在一行中显示国家/地区,但每个州的数据将有不同的地方,需要在该分组行的不同行中显示(在这种情况下每个州)。

标签: jquery jqgrid


【解决方案1】:

我建议您使用cellattr 在某些单元格上设置rowspan 属性或设置style="display:none" 以隐藏其他不需要的单元格。这个想法与the answer中的colspan相同。

因此,您可以创建以下网格(请参阅the demo

或另一个(见another demo

网格的问题在于另一个 jqGrid 功能,如排序、分页、悬停和选择。一些功能可以通过额外的努力实现,但另一种更难实现。

我在演示中使用的代码如下:

var mydata = [
        { id: "1", country: "USA", state: "Texas",      city: "Houston",       attraction: "NASA",               zip: "77058", attr: {country: {rowspan: "5"},    state: {rowspan: "5"}} },
        { id: "2", country: "USA", state: "Texas",      city: "Austin",        attraction: "6th street",         zip: "78704", attr: {country: {display: "none"}, state: {display: "none"}} },
        { id: "3", country: "USA", state: "Texas",      city: "Arlinton",      attraction: "Cowboys Stadium",    zip: "76011", attr: {country: {display: "none"}, state: {display: "none"}} },
        { id: "4", country: "USA", state: "Texas",      city: "Plano",         attraction: "XYZ place",          zip: "54643", attr: {country: {display: "none"}, state: {display: "none"}} },
        { id: "5", country: "USA", state: "Texas",      city: "Dallas",        attraction: "Reunion tower",      zip: "12323", attr: {country: {display: "none"}, state: {display: "none"}} },
        { id: "6", country: "USA", state: "California", city: "Los Angeles",   attraction: "Hollywood",          zip: "65456", attr: {country: {rowspan: "4"},    state: {rowspan: "4"}} },
        { id: "7", country: "USA", state: "California", city: "San Francisco", attraction: "Golden Gate bridge", zip: "94129", attr: {country: {display: "none"}, state: {display: "none"}} },
        { id: "8", country: "USA", state: "California", city: "San Diego",     attraction: "See world",          zip: "56653", attr: {country: {display: "none"}, state: {display: "none"}} },
        { id: "9", country: "USA", state: "California", city: "Anaheim",       attraction: "Disneyworld",        zip: "92802", attr: {country: {display: "none"}, state: {display: "none"}} }
    ],
    arrtSetting = function (rowId, val, rawObject, cm) {
        var attr = rawObject.attr[cm.name], result;
        if (attr.rowspan) {
            result = ' rowspan=' + '"' + attr.rowspan + '"';
        } else if (attr.display) {
            result = ' style="display:' + attr.display + '"';
        }
        return result;
    };

$("#list").jqGrid({
    datatype: 'local',
    data: mydata,
    colNames: ['Country', 'State', 'City', 'Attraction', 'Zip code'],
    colModel: [
        { name: 'country', width: 70, align: 'center', cellattr: arrtSetting },
        { name: 'state', width: 80, align: 'center', cellattr: arrtSetting },
        { name: 'city', width: 90 },
        { name: 'attraction', width: 120 },
        { name: 'zip', index: 'tax', width: 60, align: 'right' }
    ],
    cmTemplate: {sortable: false},
    rowNum: 100,
    gridview: true,
    hoverrows: false,
    autoencode: true,
    ignoreCase: true,
    viewrecords: true,
    height: '100%',
    caption: 'Grid with rowSpan attributes',
    beforeSelectRow: function () {
        return false;
    }
});

我在上面的代码中使用了附加的attr 属性与输入数据放在一起。这只是一个例子。我想让cellattr 函数的实现更简单。您可以使用相同的想法并将cellattr 所需的信息以任何其他格式放置。

【讨论】:

  • 奥列格:太好了!非常感谢,你总是乐于助人。这绝对是有帮助的。我只是想知道我们是否能够实现其他网格功能,例如分页、排序。我也计划实现动态 colmodel,不确定在这种情况下如何工作。请你看看我的另一个问题here。我已经出去了,所以无法回复或将其标记为已回答,对此感到抱歉:(
  • Oleg:有机会的时候请看一下我的问题here。在此先感谢...
  • @varaprakash:我读了这个问题,但不明白这个问题。您需要哪种包装以及包装问题与colModel 的动态加载有何关系?为什么 JSON 响应包含 results 部分与数据,但您使用 datatype: 'json' 并且数据将被忽略。主要问题是:您需要哪种包装?
  • 非常感谢您的回复。我正在尝试使用我在问题中提到的方法来实现动态 colmodel。在 ajax 响应中,我试图发送 colmodel 和数据,这样我就可以避免来自 jqgrid 的另一个调用来加载数据。但正如你所说,如果我使用 datatype: json 它会忽略数据。但是,如果我使用 datatype: local,我可以使用分页、排序等其他功能吗?关于换行,如果数据超过列宽,它不会自动换行,所以我想在 colmodel 中发送 cellatr 函数,但这不起作用。谢谢..
  • @janina:我在回答中写道,上面的代码不是针对jqGrid的排序、分页、悬停和选择功能的。
【解决方案2】:

这是我的 JSON 数据解决方案:

var prevCellVal = { cellId: undefined, value: undefined };

$("#list").jqGrid({
    url: 'your WS url'
    datatype: 'json',
    mtype: "POST",
    ajaxGridOptions: {
        contentType: "application/json"
    },
    colNames: ['Country', 'State', 'City', 'Attraction', 'Zip code'],
    colModel: [
        { name: 'country', width: 70, align: 'center', 
            cellattr: function (rowId, val, rawObject, cm, rdata) {
                        var result;

                        if (prevCellVal.value == val) {
                            result = ' style="display: none" rowspanid="' + prevCellVal.cellId + '"';
                        }
                        else {
                            var cellId = this.id + '_row_' + rowId + '_' + cm.name;

                            result = ' rowspan="1" id="' + cellId + '"';
                            prevCellVal = { cellId: cellId, value: val };
                        }

                        return result;
                    }
        },
        { name: 'state', width: 80, align: 'center' },
        { name: 'city', width: 90 },
        { name: 'attraction', width: 120 },
        { name: 'zip', index: 'tax', width: 60, align: 'right' }
    ],
    cmTemplate: {sortable: false},
    rowNum: 100,
    gridview: true,
    hoverrows: false,
    autoencode: true,
    ignoreCase: true,
    viewrecords: true,
    height: '100%',
    caption: 'Grid with rowSpan attributes',
    beforeSelectRow: function () {
        return false;
    },
    gridComplete: function () {
        var grid = this;

        $('td[rowspan="1"]', grid).each(function () {
            var spans = $('td[rowspanid="' + this.id + '"]', grid).length + 1;

            if (spans > 1) {
                $(this).attr('rowspan', spans);
            }
        });
    }
});

此示例适用于单列,但只需稍作修正,它也可用于多列。

【讨论】:

    【解决方案3】:

    嘿,“pistipanko”

    我对您的解决方案进行了更改,我认为效果更好。

    cellattr: function(rowId, val, rawObject, cm, rdata) {
                            var result;
                            var cellId = this.id + '_row_' + rawObject[3] + grid.getGridParam('page');
    
                            if (prevCellVal.cellId == cellId) {
                                result = ' style="display: none"';
                            }
                            else {
                                result = ' rowspan="' + rawObject[6] + '"';
                                prevCellVal = { cellId: cellId, value: rawObject[3] };
                            }
    
                            return result;
                        }
    

    我正在使用另一个列的值进行分组,这就是rawObject[3] 的原因 我正在使用从rawObject[6] 中的应用程序返回的行跨度值

    效果很好。

    希望对你有帮助:)

    【讨论】:

    • 你说得对,我也根据自己的需要编辑了我的解决方案,就像你所做的那样,这只是一个例子。
    • 是的 :) 你注意到我把页码放在 cellid 中了吗?我这样做是为了重复分组,如果它的内容进入另一个页面:)
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2016-04-05
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2021-07-24
    相关资源
    最近更新 更多