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

问题描述:

在网页上使用jqGrid 4.5.3,我有可以是文本或数字的数据。我在列上使用了一个自定义的排序函数,但它并没有按照我期望排序的方式排序。jqGrid - 自定义排序功能 - 排序数字和文本

我在网格中的行下面的数据,这是他们被发送的顺序:

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的自定义排序函数的几个例子,但他们正在调用网格数据的自定义排序,在那里它按该单元格数据的子串进行排序。我无法找到正在排序的数据是数字和文本混合的地方。

请让我知道如果我错过了本专栏的自定义排序功能的东西。谢谢!

我能够解决我遇到的问题(文本总是在顶部,以及其他奇怪的排序结果)。结果发现有一些事情同时发生,我相信这些都是对网格中数据排序行为的贡献。

第一个问题是在网格的sortname。我最初是通过身份证号码进行排序的,在更改过程中,我更改为隐藏字段。我更改了存储过程和代码,以便通过显示并可在网格上排序的日期时间字段对SQL中的数据进行排序。这一次改变解决了我一直在寻找的奇怪种类,其中网格在网格中会有相同的数量 - 无序 - 多次。

第二个变化是自定义排序功能。我的数据将有三种可能的特点之一:

  1. 这可能是一个3位数,
  2. 这可能是一个4位数字,或
  3. 这可能是因为将有一个名称或字符串一些文字在里面。

我可以把显示在功能&看到它被计算长度权&正确地解释数据的特性。

我再重新写了自定义排序功能如下:

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--他在这个主题上的帖子我多次阅读,试图调试我的排序功能出了什么问题。

如果你的文本值是有前缀,你有号码,下面的自定义功能将有所帮助。

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; 
} 
}