jqGrid中列的百分比排序

时间:2012-10-01 09:47:41

标签: jqgrid

在我的jqGrid中有以下内容:

colModel.push({ name: 'pcc2008-2007', index: 'pcc0807', width: 100, align: "Right",
    sorttype: "float", formatter: "number", resizable: false,
    formatter: function (cellvalue, options, rowObject) {
        return percentageChange(rowObject['vol08'], rowObject['vol07'], 4);
    }
});

格式化程序工作正常,最后返回一个值(前缀为%),但是当我点击网格上的列标题时,结果不会被排序。

我添加了一个“unformatter”函数,它只是将“%”替换为什么,看不出是否产生了正确的排序,但同样排序根本没有正确实现。

有人可以解释我做错了吗?

**编辑**

function percentageChange(endYear, startYear, duration) {
    var p1 = Math.abs((endYear - startYear) / Math.abs(startYear) * 100);
    if (p1 == Number.POSITIVE_INFINITY || p1 == Number.NEGATIVE_INFINITY) { return '0'; }
    if (isNaN(p1)) { return '0'; }
    else { return Math.round(p1 * 100) / 100; }
}

** EDI2 **

整个jqGrid在这里打电话:

$("#list2").jqGrid({
    datastr: formattedBrandData,
    datatype: "jsonstring",
    colModel: colModel,
    height: 'auto',
    width: 1000,
    loadonce: true,
    sortable:  true,
    gridview: true,
    shrinkToFit: false,
    viewrecords: true,
    rowNum: 100,
    gridComplete: function (index, colindex, sortorder) {

        var aaa = $("#list2").jqGrid('getRowData');
        formattedBrandData = aaa;
        drawChart();


        var rowIDs = jQuery("#list2").getDataIDs();
        for (var i = 0; i < rowIDs.length; i = i + 1) {
            if (i == 0) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour1'); }
            if (i == 1) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour2'); }
            if (i == 2) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour3'); }
            if (i == 3) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour4'); }
            if (i == 4) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour5'); }
            if (i == 5) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour6'); }
            if (i == 6) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour7'); }
            if (i == 7) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour8'); }
        }
    },

    loadComplete: function () {

    },


    jsonReader: {
        repeatitems: false,
        root: function (obj) {
            return obj;
        },
        onComplete: function (data, response) {

        }
    }
});

1 个答案:

答案 0 :(得分:3)

我认为你应该更好地使用

formatter: 'currency', formatoptions: {suffix: '%'}, sorttype: 'currency'

请参阅the demo

enter image description here

更新:您发布的代码存在一些问题。

第一个是jqGrid将调用的gridComplete回调。 jqGrid从不使用其他参数调用gridComplete,因此回调的indexcolindexsortorder参数将始终为undefined。您应该删除参数。

第二个问题是设计问题。您可以将datatype: "jsonstring"与提供数据的datastr: formattedBrandData一起使用。数据将一次读取,数据将保存在内部data数组中,其属性与name的{​​{1}}属性相同。因此,在colModel数组中填充'pcc2008-2007'属性会更有效,更轻松。您将计算值一次,并将仅使用计算的formattedBrandData结果。稍后您可以直接使用预定义的float格式化程序(请参阅上面的答案),仅在浮点值的末尾添加currency

如果您使用某种本地数据类型(包括%),则不应将datatype: "jsonstring"其他用作index。如果将使用name属性中的值,最好从index中删除任何colModel定义。支持namename的不同值,仅在indexdatatype: "json"的情况下才有用,其中服务器代码负责数据的排序。

只要有可能,您应该在datatype: "xml"gridComplete内减少网格的更改次数(或HTML页面上数据的任何其他更改)。如果一个元素发生一次更改,则Web浏览器必须重新计算页面上所有其他现有元素的位置。因此页面上元素的更改可能很昂贵。另一方面,loadComplete与格式化程序的使用,gridview: true回调(请参阅here)或rowattr允许修改网格之前的HTML片段< / em>它将被放置在页面上。在你获得最佳表现的方式。有关演示cellattr回调的相应代码示例,请参阅the answer

关于性能的最后一点评论。代码rowattr慢慢为jQuery("#" + rowIDs[i], $('#list2'))。原因是jQuery("#" + rowIDs[i])只使用被编入索引的jQuery("#" + rowIDs[i])。所以它很快就能运作。另一方面,代码id使用显式上下文,不允许使用HTML页面的索引 。因此,简单扫描将用于实施,这将是缓慢的。