jQgrid:多列行标题

时间:2011-01-17 11:47:30

标签: javascript jquery jqgrid

我正在尝试扩展我的jQGrid以使标题有多行。

它看起来像这样

               -----------------------
Level 1 - >    | Application         |
               -----------------------  
Level 2 - >    |Code    | Name       |  
               -----------------------
               | 0002827| Mobile Phone1
               | 0202827| Mobile Phone2
               | 0042827| Mobile Phon3e
               | 0005827| Mobile Phone4
               | 0002627| Mobile Phon5e
               | 0002877| Mobile Phone6
               | 0002828| Mobile Phone7

我想知道如何用jQGrid 3.8.2做到这一点?有任何想法吗?

5 个答案:

答案 0 :(得分:12)

问题实际上并不像乍看之下那么容易。我试图找到一个简单的解决方案,但我找到的最佳结果是hereenter image description here

标题的顺序(第1级和第2级)并不像人们想要的那样。其他尝试(例如thisthis)是错误的,因为排序和列调整大小的工作不正确。

为了理解:网格将<thead> 移到表格之外,并将其置于单独的 中,这些 位于表格上方(请参阅{{ 3}}了解更多信息)。它允许包含一些其他信息,例如在表头和表体之间搜索工具栏 。如果在主列标题上存在其他标题(另外一个<tr>带有<th>元素),则jqGrid代码中的其他位置(如列大小调整和列排序)将无法正常工作。因此,只有在主列标题下插入 (当然看起来不太好)不会破坏列的排序和大小调整。

更新:在某些限制条件下,请参阅here确实提供问题的解决方案。

答案 1 :(得分:5)

我知道这是一个迟到的答案,但为了将来参考header grouping现在包含在jqGrid版本4.2.0中

答案 2 :(得分:2)

修改了Oleg的原创想法并将其变成了一个可以制作几个“跨越”标题的函数:

function head_groups(mygrid, settings){

    var colModel, header, config, ths;

    if (typeof mygrid == 'string') mygrid = $(mygrid);

    colModel = mygrid[0].p.colModel;
    ths = mygrid[0].grid.headers;
    header = mygrid.closest("div.ui-jqgrid-view").find("table.ui-jqgrid-htable > thead");

    if (!header.children("tr.head_group").length) {
        header.find("th").attr('rowspan', 2);
        header.append('<tr class="head_group"></tr>');
    }

    for (c in settings) {

        config = settings[c]; // caption, col, span

        for(var i=0; i<colModel.length; i++) {

            if (colModel[i].name == config.col) {
                for(var s=0; s<config.span; s++) {
                    $(ths[i+s].el).removeAttr('rowspan');
                }
                i +=s; // skip unnecessary cycles
                header.children("tr.head_group").append('<th class="ui-state-default ui-th-ltr" id="span_'+config.col+'" colspan="'+config.span+'" role="columnheader">'+config.caption+'</th>');
            }
        }
    }
}

使用示例:

head_groups("table#results", [
    {caption: 'Test 1', col: 'num', span: 2},
    {caption: 'Result', col: 'sta', span: 3},
    {caption: 'Bla bla bla', col: 'bl2', span: 2}
]);

它还为标题行添加了一个类,为某些样式或特殊功能添加了标题单元格的ID。

实际上这可以很容易地集成到jqGrid核心中:)

答案 3 :(得分:1)

根据Help needed in Multiple column grouping (jQGrid 3.8.2),jqGrid支持团队表示:

  

目前不支持此功能。单个列(子列)中的多个列标题当前不是jqGrid的一个功能。

答案 4 :(得分:0)

我修改了Oleg的代码,以便能够在第一行显示分组,基本上我创建了一个虚拟的第三行,只是删除了第一行中的文本。

var x = 0;
insertColumnGroupHeader = function (mygrid, mergeSettingList) {
    var i, cmi, skip = 0, $tr, colHeader, iCol, $th,
        colModel = mygrid[0].p.colModel,
        ths = mygrid[0].grid.headers,
        gview = mygrid.closest("div.ui-jqgrid-view"),
    thead = gview.find("table.ui-jqgrid-htable>thead");
    $tr = $("<tr>");

    var currCaption = '';
    var currColumnName = '';
    var currSpan = 0;
    var currSkip = 0;
    tr = "<tr>";
    for (i = 0; i < colModel.length; i++) {
        $th = $(ths[i].el);
        cmi = colModel[i];

        if (currSkip === 0) {
            currColumnName = '';
            for (j = 0; j < mergeSettingList.length; j++) {
                if (mergeSettingList[j].col == cmi.name) {
                    currCaption = mergeSettingList[j].caption;
                    currColumnName = mergeSettingList[j].col;
                    currSpan = mergeSettingList[j].span;
                    currWidth = mergeSettingList[j].width;
                    break;
                }
            }
        }

        if (cmi.name !== currColumnName) {
            if (currSkip === 0) {
                $th.attr("rowspan", "2");
            } else {
                // Skip part of group
                denySelectionOnDoubleClick($th);
                currSkip--;
            }
        } else {
            denySelectionOnDoubleClick($th);

            tr += '<th class="ui-state-default ui-th-ltr" colspan="' + currSpan + '" role="columnheader">' + currCaption + '</th>';
            currSkip = currSpan - 1;
        }
    }
    tr += "</tr>";
    mygrid.closest("div.ui-jqgrid-view").find("table.ui-jqgrid-htable > thead").append(tr);

    $th = $(ths[0].el);
    tr = "<tr>";
    var html = $th.parent().html();
    tr += html;
    tr += "</tr>";

    mygrid.closest("div.ui-jqgrid-view").find("table.ui-jqgrid-htable > thead").append(tr);
    for (i = 0; i < colModel.length; i++) {
        $th = $(ths[i].el);
        cmi = colModel[i];
        $th.empty();
        $th.css({"padding-top": "0px", height: "0px", border: "0px"});
    }
}

示例电话。

var mergeParam = [
        {caption: ' ', col: 'ActionKey', span: 3},
        {caption: 'Planned', col: 'PlannedStartColKey', span: 5},
        {caption: 'Actual', col: 'ActualStartColKey', span: 12}
    ];
insertColumnGroupHeader2($(GridNames.Grid), mergeParam);