2014-01-14 100 views
0

在網頁上使用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的自定義排序函數的幾個例子,但他們正在調用網格數據的自定義排序,在那裏它按該單元格數據的子串進行排序。我無法找到正在排序的數據是數字和文本混合的地方。

請讓我知道如果我錯過了本專欄的自定義排序功能的東西。謝謝!

回答

0

我能夠解決我遇到的問題(文本總是在頂部,以及其他奇怪的排序結果)。結果發現有一些事情同時發生,我相信這些都是對網格中數據排序行爲的貢獻。

第一個問題是在網格的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--他在這個主題上的帖子我多次閱讀,試圖調試我的排序功能出了什麼問題。

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