jqGrid - 自定义排序功能 - 对数字和文本进行排序

时间:2014-01-14 20:37:21

标签: jquery excel sorting jqgrid

在网页上使用jqGrid 4.5.3,我有可以是文本或数字的数据。我在列上使用自定义排序函数,但它没有按照我期望的排序方式进行排序。

我在网格的行中有以下数据,这是它们的发送顺序:

123
654
321
Test
James

如果我采用相同的数据&把它放在Excel中并对其进行排序,顺序(从最小到最大)是:

123
321
654
James
Test

如果我在Excel中再次对它进行排序,从最大到最小,它是:

Test
James
654
321
123

在我的jQgrid中,订单总是首先是文本,然后是数字。两者都正确排序(在它们之间),但文本始终位于网格的顶部。自定义排序的代码是:

function myCustSort (myCell, rowObj ) {
    var n = myCell.length;
    var intRegex = /^\d+$/ ;
    var checkNumeric;
    checkNumeric = intRegex.test(myCell);
    if (typeof myCell === "string") {
        if ( checkNumeric === true) {
            return parseInt( myCell);
            }
        else {
            return myCell;
            }
        }
    else {
        return myCell;
        }
} // end myCustSort

要排序的列的colModel是:

{name:"TestData",
index:"TestData",
width:30,
align:"center", 
sorttype: function (cell, obj ) {
        return myCustSort (cell) ;
        },
xmlmap:"Rowset>Row>TestData"
},

我在自定义排序功能中有显示,它正确地将数值计算为数字,将字符串正确地计算为字符串,但是,我无法使其排序方式与Excel中的相同数据相同。

我已经查看了jqGrid的自定义排序函数的几个示例,但它们正在调用网格数据的自定义排序,其中它按照该单元格数据的子字符串进行排序。我无法找到一个被排序的数据是数字和文本混合的地方。

如果我在此专栏的自定义排序功能上遗漏了某些内容,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:0)

我能够解决我遇到的问题(文本始终位于顶部,以及其他奇怪的排序结果)。事实证明,有几件事情同时发生,我相信所有这些都有助于网格中数据排序的行为。

第一个问题出现在网格的sortname中。我最初用ID编号对它进行排序,在更改过程中我将其更改为隐藏字段。我更改了存储过程和代码,以便通过显示的日期时间字段对SQL中的数据进行排序,并且可以在网格上进行排序。这一个变化解决了我所获得的各种奇怪的类型,其中网格具有相同的数字 - 乱序 - 在网格内多次。

第二个更改是自定义排序功能。我的数据将具有三个可能的特征之一:

  1. 可以是3位数字,
  2. 可以是4位数字,或
  3. 它可以是一个字符串,其中包含名称或文本。
  4. 我可以在功能和放大器中放置显示器。看到它正在计算正确的长度&正确地解释数据的特征。

    然后我重新编写了自定义排序功能,如下所示:

    function myCustSort (myCell, options, rowObj ) {
        var n = myCell.length;
        var intRegex = /^\d+$/ ;
        var checkNumeric;
        checkNumeric = intRegex.test(myCell);
        if (typeof myCell === "string") {
            var myIntStr;
            if ( checkNumeric === true) {
                if ( n === 3 ) {
                    myIntStr = "0" + parseInt( myCell);
                    }
                else {
                    myIntStr = "0" + parseInt( myCell);
                    myIntStr = myIntStr.substring(1);
                    }
                }
            else {
                myIntStr = myCell;
                }
            return myIntStr;
            }
        else {
            return myCell;
            }
    } // end myCustSort
    

    所以现在,文本正确排序,数字也是如此(所以我在2之前都没有10& 1000)。感谢@Oleg - 关于这个主题的帖子我曾多次尝试调试我的排序函数的错误。

答案 1 :(得分:0)

如果您的文本值具有前缀且您有数字,则以下自定义功能将有所帮助。

function myCustSort(myCell, options, rowObj) {
var n = myCell.length;
var intRegex = /^\d+$/;
var checkNumeric;
checkNumeric = intRegex.test(myCell);
if (typeof myCell === "string") {
    var myIntStr;
    if (checkNumeric === true) {

        if (n === 9) {
            myIntStr = "0" + parseInt(myCell);
        }
        else if (n === 8) {
            myIntStr = "00" + parseInt(myCell);
        }
        else if (n === 7) {
            myIntStr = "000" + parseInt(myCell);
        }
        else if (n === 6) {
            myIntStr = "0000" + parseInt(myCell);
        }
        else if (n === 5) {
            myIntStr = "00000" + parseInt(myCell);
        }
        else if (n === 4) {
            myIntStr = "000000" + parseInt(myCell);
        }
        else if (n === 3) {
            myIntStr = "0000000" + parseInt(myCell);
        }
        else if (n === 2) {
            myIntStr = "00000000" + parseInt(myCell);
        }
        else {
            myIntStr = "000000000" + parseInt(myCell);
        }
    }
    else {

        var isChecktype = myCell.indexOf("PREFIX");
        if (isChecktype <= -1)  {
            var odvalue = myCell.split('PREFIX');
            var odlength = odvalue[1].length;

            if (odlength === 3) {
                myIntStr = "PREFIX" + "0" + parseInt(odvalue[1]);
            }
            else if (odlength === 2) {
                myIntStr = "PREFIX" + "00" + parseInt(odvalue[1]);
            }
            else {
                myIntStr = "PREFIX" + "000" + parseInt(odvalue[1]);
            }
        }


    }
    return myIntStr;
}
else {

    return myCell;
}
}