在网页上使用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的自定义排序函数的几个示例,但它们正在调用网格数据的自定义排序,其中它按照该单元格数据的子字符串进行排序。我无法找到一个被排序的数据是数字和文本混合的地方。
如果我在此专栏的自定义排序功能上遗漏了某些内容,请告诉我。谢谢!
答案 0 :(得分:0)
我能够解决我遇到的问题(文本始终位于顶部,以及其他奇怪的排序结果)。事实证明,有几件事情同时发生,我相信所有这些都有助于网格中数据排序的行为。
第一个问题出现在网格的sortname
中。我最初用ID编号对它进行排序,在更改过程中我将其更改为隐藏字段。我更改了存储过程和代码,以便通过显示的日期时间字段对SQL中的数据进行排序,并且可以在网格上进行排序。这一个变化解决了我所获得的各种奇怪的类型,其中网格具有相同的数字 - 乱序 - 在网格内多次。
第二个更改是自定义排序功能。我的数据将具有三个可能的特征之一:
我可以在功能和放大器中放置显示器。看到它正在计算正确的长度&正确地解释数据的特征。
然后我重新编写了自定义排序功能,如下所示:
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;
}
}