jqGrid格式化程序和可排序列 - 不排序

时间:2010-05-03 06:46:56

标签: jquery jqgrid

我正在为我的jqGrid columnModel使用自定义格式化程序,我无法使用格式化程序函数进行排序。如果我删除格式化列正常排序。

jQuery("#listAgentOptions").jqGrid({
    height: 240,
    datatype: "local",
    colNames: [' ', 'First Name', 'Last Name', 'Role'],
    colModel: [
    { name: 'status', index: 'status', width: 18, sorttype: 'text', align: 'center', formatter: function(cellvalue, options, rowObject) {
        return cellvalue == 1 ? "<img src='images/agent_green_s.png' alt='Ready' title='Ready' />" :
        cellvalue == 3 ? "<img src='images/agent_red_s.png' alt='Busy' title='Busy' />" :
        "<img src='images/agent_orange_s.png' alt='Pending Ready' title='Pending Ready' />";
    },
        unformat:
    function(cellvalue, options, rowObject) { return Math.floor(Math.random() + 0.1).toString(); }
    },
    { name: 'firstName', index: 'firstName', width: 92 },
    { name: 'lastName', index: 'lastName', width: 142 },
    { name: 'role', index: 'role', sorttype: 'int', width: 36, align: 'center', formatter: function(cellvalue, options, rowObject) {
        return cellvalue == true ? "<img src='images/user_gray.png' alt='Supervisor' title='Supervisor' />" : "<img src='images/user.png' alt='Agent' title='Agent' />";
    }, unformat:
    function(cellvalue, options, rowObject) { return cellvalue; }
    }
    ],
    sortname: 'lastName'
});

行添加如下:

jQuery("#listAgentOptions").jqGrid('clearGridData');
$.each(result, function(i, item) {
    if (item.ContactType == 1) {
        jQuery("#listAgentOptions").jqGrid('addRowData', i+1, { firstName: item.ContactName.split(" ")[0], lastName: item.ContactName.split(" ")[1],
        role: item.IsSupervisor,
        status: item.Status == "Ready" ? 1 : item.Status == "Busy" ? 3 : 2
        });
    }
});

如何让排序正常工作?

更新。我刚刚下载了最新版本的jqGrid - 同样的问题。

我也尝试过使用unformat: function(cellvalue, options, rowObject) { },但是cellvalue在那里是空的:-E当我使用return Math.floor(Math.random() + 0.1).toString();时,它会随机排序(每次点击),但return cellvalue;只返回一个空字符串。

4 个答案:

答案 0 :(得分:2)

在内部,jqGrid使用unformat来获取单元格的值:

        $.each(ts.rows, function(index, row) {
            try { sv = $.unformat($(row).children('td').eq(col),{rowId:row.id, colModel:ts.p.colModel[col]},col,true);}
            catch (_) { sv = $(row).children('td').eq(col).text(); }
            row.sortKey = findSortKey(sv);
            rows[index] = this;
        });

然后使用列的sorttype的处理程序解析单元格值,对于int:

            findSortKey = function($cell) {
                return IntNum($cell.replace(stripNum, ''),0);
            };

所以基本上,如果你的unformat函数为每个单元格返回正确的整数,我希望列排序也能正常工作。如果您仍然遇到问题,请发布完整的代码,包括unformat

的内容

答案 1 :(得分:1)

可能是你的问题不在你寻找的地方。

您在jqGrid中使用哪种数据?我的意思是参数数据类型的值。如果从服务器加载jqGrid数据,服务器将从客户端接收排序信息,服务器必须返回已排序的数据。 Formatter仅用于显示您喜欢的数据。 客户端排序可以使用datatype: 'xmlstring'datatype: "clientSide",但不能使用dataType:"xml"dataType:"json"dataType:"jsonp"。像sorttype这样的参数只适用于客户端排序,并且会被服务器端排序忽略。主要角色:如果必须定义jqGrid的 url 参数,请使用服务器端排序。

答案 2 :(得分:1)

好的,我已经知道发生了什么。

首先,您必须使用unformat将初始值传递回jqGrid排序函数。

jqGrid正在将$(row).text()传递给unformat函数,对于只有html标记的单元格,该函数返回一个空字符串,并且没有更改它的选项。但是,你可以做的是使用unformat函数的第三个参数,在我的例子中是rowObject。然后,您可以使用$(rowObject).html()检索实际的单元格值,并将其解析回值。现在可以进行排序。

要记住的另一件事是,如果您使用sorrtype: 'int',则必须将整数作为字符串返回,例如return '1';

答案 3 :(得分:0)

尝试使用Firebug进行调试并检查服务器正在接收的内容。使用sortable: true

顺便说一句,sorttype参数只能在本地(datatype: local)工作。