【问题标题】:jqGrid - custom sort function - sorting both numbers and textjqGrid - 自定义排序功能 - 对数字和文本进行排序
【发布时间】:2014-02-03 02:24:03
【问题描述】:

在网页上使用 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 的几个自定义排序函数的示例,但是它们正在对网格数据调用自定义排序,其中它按该单元格数据的子字符串进行排序。我一直无法找到一个正在排序的数据是数字和文本的混合体。

如果我在此列的自定义排序功能上遗漏了什么,请告诉我。谢谢!

【问题讨论】:

    标签: jquery excel sorting jqgrid


    【解决方案1】:

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

    第一个问题在网格的sortname 中。我最初是按一个 ID 号对其进行排序的,在更改过程中我已将其更改为隐藏字段。我更改了存储过程和代码,以通过显示的日期时间字段对 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 - 我已经阅读了好几次关于这个主题的帖子,试图调试我的排序功能出了什么问题。

    【讨论】:

      【解决方案2】:

      如果你的文本值有前缀并且你有数字,下面的自定义函数会有所帮助。

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

      【讨论】:

        猜你喜欢
        • 2015-11-01
        • 2018-08-26
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        • 2013-10-22
        • 2022-01-05
        • 2011-12-16
        相关资源
        最近更新 更多