0

私の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) {

        }
    }
});
4

1 に答える 1

3

使ったほうがいいと思います

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

デモを見る:

ここに画像の説明を入力

更新:投稿したコードにはいくつかの問題があります。

最初のものは、gridCompletejqGrid によって呼び出されるコールバックです。jqGrid はgridComplete追加のパラメーターを使用して呼び出すことはないためindex、コールバックのパラメーターは常に になりcolindexます。パラメータを削除する必要があります。sortorderundefined

2つ目の問題はデザインの問題です。データを提供するものdatatype: "jsonstring"と一緒に使用します。データは一度datastr: formattedBrandData読み込まれ、データは のプロパティと同じプロパティで内部配列に保存されます。そのため、配列内のプロパティをより効果的かつ簡単に埋めることができます。値を一度計算し、計算結果のみを使用します。後で、事前定義されたフォーマッター (上記の私の回答を参照) を直接使用して、float 値の末尾に追加することができます。datanamecolModel'pcc2008-2007'formattedBrandDatafloatcurrency%

一部のローカル データ型 (を含むdatatype: "jsonstring") を使用する場合は、index他の as を使用しないでくださいname。プロパティの値を使用する場合は、indexから定義を削除することをお勧めします。とのさまざまな値がサポートされており、サーバー コードがデータの並べ替えを担当する場合にのみ役立ちます。colModelnamenameindexdatatype: "json"datatype: "xml"

gridComplete内部またはloadComplete可能な限り、グリッドの変更 (または HTML ページ上のデータのその他の変更) の数を減らす必要があります。1 つの要素が 1 つ変更された場合、Web ブラウザはページ上の他のすべての既存要素の位置を再計算する必要があります。そのため、ページ上の要素の変更にはコストがかかる可能性があります。一方、をフォーマッタ、コールバック (こちらを参照)gridview: trueと一緒に使用するか、ページに配置するにグリッドの HTML フラグメントを変更できます。最高のパフォーマンスを得る方法です。コールバックが示されている対応するコード例の回答を参照してください。rowattrcellattrrowattr

最後に演奏について一言。コードjQuery("#" + rowIDs[i], $('#list2'))はゆっくりとjQuery("#" + rowIDs[i]). その理由は、インデックス化されたものをjQuery("#" + rowIDs[i])使用するだけだからです。idそのため、動作が速いです。反対側では、コードはHTML ページjQuery("#" + rowIDs[i], $('#list2'))のインデックスを使用できない明示的なコンテキストを使用しています。そのため、実装には単純なスキャンが使用されますが、これは遅くなります。

于 2012-10-01T10:40:08.170 に答える