2011-12-17 79 views
6

如果網格再次打開或頁面刷新時如何設置當前行?如何在jqgrid中保留當前行

回答於Persisting jqGrid column preferences描述如何持續列寬和其他一些參數。

在這個答案演示我點擊了一些行,並按下F5。先前點擊的行未被突出顯示。 如何保存/恢復本地存儲中的當前行?

更新

如果jqGrid的列結構在應用程序修改和用戶從瀏覽器中打開應用程序再次, restorecolumnstate創建其中一些元素缺失無效colmodel。這會導致refreshSearchingToolbar中的異常,它假定所有的colmodel元素都存在。

如何解決這個問題?在這種情況下,如何檢測改性colmodol,而不是恢復colmodel?或者應該restoreColumnState更新colModel,以便創建正確的數組?

**更新2 **

如果myColumnsState.permutation包含空值$grid.jqGrid("remapColumns", myColumnsState.permutation, true)創建無效colmodel。下面是與調試器的截圖之前和之後remapColumns調用

enter image description here

後:

after

我解決了這個問題通過chaning代碼

if (isColState && myColumnsState.permutation.length > 0) { 
     var i, isnull = false; 
     for (i = 0; i < myColumnsState.permutation.length; i = i + 1) { 
      if (myColumnsState.permutation[i] == null) { 
       isnull = true; 
       break; 
      } 
     } 
     if (!isnull) { 
      $grid.jqGrid("remapColumns", myColumnsState.permutation, true); 
     } 

這是最好的解決辦法?

回答

7

我組合了代碼the previous answer關於堅持jqGrid列首選項與從another answer的代碼,其中我建議實現持續選擇行的代碼。值得一提的是,在multiselect:true的情況下,將使用選定行的ID數組,其中包含所有選中的,即使這些行在另一頁上也是如此。它非常實用,實現非常簡單。所以我發佈了相應的feature request,但它一直沒有回答。

現在我可以展示兩個演示:the first demo其中使用multiselect: truethe second demo它使用相同的代碼,但具有單個選擇。

我使用的代碼中最重要的部分將在下面找到。

有一件事非常重要:您應該在每個使用的頁面中修改myColumnStateName的值。變量的值包含localStorage中列狀態的名稱。所以你不會改變名字,你會分享不同表格的狀態,這可能會導致非常奇怪的效果。您可以考慮使用從當前頁面的名稱或其URL構成的名稱作爲值myColumnStateName

var $grid = $("#list"), 
    getColumnIndex = function (grid, columnIndex) { 
     var cm = grid.jqGrid('getGridParam', 'colModel'), i, l = cm.length; 
     for (i = 0; i < l; i++) { 
      if ((cm[i].index || cm[i].name) === columnIndex) { 
       return i; // return the colModel index 
      } 
     } 
     return -1; 
    }, 
    refreshSerchingToolbar = function ($grid, myDefaultSearch) { 
     var postData = $grid.jqGrid('getGridParam', 'postData'), filters, i, l, 
      rules, rule, iCol, cm = $grid.jqGrid('getGridParam', 'colModel'), 
      cmi, control, tagName; 

     for (i = 0, l = cm.length; i < l; i++) { 
      control = $("#gs_" + $.jgrid.jqID(cm[i].name)); 
      if (control.length > 0) { 
       tagName = control[0].tagName.toUpperCase(); 
       if (tagName === "SELECT") { // && cmi.stype === "select" 
        control.find("option[value='']") 
         .attr('selected', 'selected'); 
       } else if (tagName === "INPUT") { 
        control.val(''); 
       } 
      } 
     } 

     if (typeof (postData.filters) === "string" && 
       typeof ($grid[0].ftoolbar) === "boolean" && $grid[0].ftoolbar) { 

      filters = $.parseJSON(postData.filters); 
      if (filters && filters.groupOp === "AND" && typeof (filters.groups) === "undefined") { 
       // only in case of advance searching without grouping we import filters in the 
       // searching toolbar 
       rules = filters.rules; 
       for (i = 0, l = rules.length; i < l; i++) { 
        rule = rules[i]; 
        iCol = getColumnIndex($grid, rule.field); 
        if (iCol >= 0) { 
         cmi = cm[iCol]; 
         control = $("#gs_" + $.jgrid.jqID(cmi.name)); 
         if (control.length > 0 && 
           (((typeof (cmi.searchoptions) === "undefined" || 
           typeof (cmi.searchoptions.sopt) === "undefined") 
           && rule.op === myDefaultSearch) || 
            (typeof (cmi.searchoptions) === "object" && 
             $.isArray(cmi.searchoptions.sopt) && 
             cmi.searchoptions.sopt.length > 0 && 
             cmi.searchoptions.sopt[0] === rule.op))) { 
          tagName = control[0].tagName.toUpperCase(); 
          if (tagName === "SELECT") { // && cmi.stype === "select" 
           control.find("option[value='" + $.jgrid.jqID(rule.data) + "']") 
            .attr('selected', 'selected'); 
          } else if (tagName === "INPUT") { 
           control.val(rule.data); 
          } 
         } 
        } 
       } 
      } 
     } 
    }, 
    saveObjectInLocalStorage = function (storageItemName, object) { 
     if (typeof window.localStorage !== 'undefined') { 
      window.localStorage.setItem(storageItemName, JSON.stringify(object)); 
     } 
    }, 
    removeObjectFromLocalStorage = function (storageItemName) { 
     if (typeof window.localStorage !== 'undefined') { 
      window.localStorage.removeItem(storageItemName); 
     } 
    }, 
    getObjectFromLocalStorage = function (storageItemName) { 
     if (typeof window.localStorage !== 'undefined') { 
      return JSON.parse(window.localStorage.getItem(storageItemName)); 
     } 
    }, 
    myColumnStateName = 'ColumnChooserAndLocalStorage2.colState', 
    idsOfSelectedRows = [], 
    saveColumnState = function (perm) { 
     var colModel = this.jqGrid('getGridParam', 'colModel'), i, l = colModel.length, colItem, cmName, 
      postData = this.jqGrid('getGridParam', 'postData'), 
      columnsState = { 
       search: this.jqGrid('getGridParam', 'search'), 
       page: this.jqGrid('getGridParam', 'page'), 
       sortname: this.jqGrid('getGridParam', 'sortname'), 
       sortorder: this.jqGrid('getGridParam', 'sortorder'), 
       permutation: perm, 
       selectedRows: idsOfSelectedRows, 
       colStates: {} 
      }, 
      colStates = columnsState.colStates; 

     if (typeof (postData.filters) !== 'undefined') { 
      columnsState.filters = postData.filters; 
     } 

     for (i = 0; i < l; i++) { 
      colItem = colModel[i]; 
      cmName = colItem.name; 
      if (cmName !== 'rn' && cmName !== 'cb' && cmName !== 'subgrid') { 
       colStates[cmName] = { 
        width: colItem.width, 
        hidden: colItem.hidden 
       }; 
      } 
     } 
     saveObjectInLocalStorage(myColumnStateName, columnsState); 
    }, 
    myColumnsState, 
    isColState, 
    restoreColumnState = function (colModel) { 
     var colItem, i, l = colModel.length, colStates, cmName, 
      columnsState = getObjectFromLocalStorage(myColumnStateName); 

     if (columnsState) { 
      colStates = columnsState.colStates; 
      for (i = 0; i < l; i++) { 
       colItem = colModel[i]; 
       cmName = colItem.name; 
       if (cmName !== 'rn' && cmName !== 'cb' && cmName !== 'subgrid') { 
        colModel[i] = $.extend(true, {}, colModel[i], colStates[cmName]); 
       } 
      } 
     } 
     return columnsState; 
    }, 
    updateIdsOfSelectedRows = function (id, isSelected) { 
     var index = idsOfSelectedRows.indexOf(id); 
     if (!isSelected && index >= 0) { 
      idsOfSelectedRows.splice(index, 1); // remove id from the list 
     } else if (index < 0) { 
      idsOfSelectedRows.push(id); 
     } 
    }, 
    firstLoad = true; 

myColumnsState = restoreColumnState(cm); 
isColState = typeof (myColumnsState) !== 'undefined' && myColumnsState !== null; 
idsOfSelectedRows = isColState && typeof (myColumnsState.selectedRows) !== "undefined" ? myColumnsState.selectedRows : []; 

$grid.jqGrid({ 
    // ... some options 
    page: isColState ? myColumnsState.page : 1, 
    search: isColState ? myColumnsState.search : false, 
    postData: isColState ? { filters: myColumnsState.filters } : {}, 
    sortname: isColState ? myColumnsState.sortname : 'invdate', 
    sortorder: isColState ? myColumnsState.sortorder : 'desc', 
    onSelectRow: function (id, isSelected) { 
     updateIdsOfSelectedRows(id, isSelected); 
     saveColumnState.call($grid, $grid[0].p.remapColumns); 
    }, 
    onSelectAll: function (aRowids, isSelected) { 
     var i, count, id; 
     for (i = 0, count = aRowids.length; i < count; i++) { 
      id = aRowids[i]; 
      updateIdsOfSelectedRows(id, isSelected); 
     } 
     saveColumnState.call($grid, $grid[0].p.remapColumns); 
    }, 
    loadComplete: function() { 
     var $this = $(this), i, count; 

     if (firstLoad) { 
      firstLoad = false; 
      if (isColState) { 
       $this.jqGrid("remapColumns", myColumnsState.permutation, true); 
      } 
      if (typeof (this.ftoolbar) !== "boolean" || !this.ftoolbar) { 
       // create toolbar if needed 
       $this.jqGrid('filterToolbar', 
        {stringResult: true, searchOnEnter: true, defaultSearch: myDefaultSearch}); 
      } 
     } 
     refreshSerchingToolbar($this, myDefaultSearch); 
     for (i = 0, count = idsOfSelectedRows.length; i < count; i++) { 
      $this.jqGrid('setSelection', idsOfSelectedRows[i], false); 
     } 
     saveColumnState.call($this, this.p.remapColumns); 
    }, 
    resizeStop: function() { 
     saveColumnState.call($grid, $grid[0].p.remapColumns); 
    } 
}); 

$grid.jqGrid('navGrid', '#pager', {edit: false, add: false, del: false}); 
$grid.jqGrid('navButtonAdd', '#pager', { 
    caption: "", 
    buttonicon: "ui-icon-closethick", 
    title: "clear saved grid's settings", 
    onClickButton: function() { 
     removeObjectFromLocalStorage(myColumnStateName); 
     window.location.reload(); 
    } 
}); 

修訂:我忘了提及,與jqGrid的4.3它是使用這裏所描述the fix非常重要的用途multiselect: true選項的情況下。在第一個演示中,我使用了包含錯誤修復的jquery.jqGrid.src.jsthe modified version

UPDATED 2:爲了便於生成用於保存網格狀態的本地存儲項的唯一名稱,我稍微修改了這些演示。的the multiselect demothe single select demo使用myColumnStateName作爲函數的下一個版本定義爲以下

var myColumnStateName = function (grid) { 
     return window.location.pathname + '#' + grid[0].id; 
    } 

myColumnStateName的使用相應地改變。此外,我擴展了列狀態以保存rowNum值。

更新3:The answer描述如何使用新的可能性免費jqGrid保存網格狀態。

+0

來自http://www.trirand.com/blog/?page_id=393/bugs/exception-after-successful-delete-in-complete-event-handler的關鍵修補程序不適用。 Everysuccess遠程刪除導致異常。 – Andrus 2011-12-18 08:54:34

+0

@安德魯斯:在我發佈的演示中,沒有刪除,添加或編輯操作。你怎麼可以嘗試沒有例外將被拋出。 – Oleg 2011-12-18 09:03:11

+0

這是一般性評論,對不起。如何在相同和不同的頁面中重複使用此代碼用於多個網格?這個代碼或其他想法可以擴展或分類jqgrid嗎? – Andrus 2011-12-18 10:21:50

4

當你像下面那樣刷新頁面時,Oleg的解決方案會產生一個錯誤。

錯誤:遺漏的類型錯誤:無法讀取未定義

線的特性 'EL':1936年在jquery.jqGrid.src.js

var previousSelectedTh = ts.grid.headers[ts.p.lastsort].el, newSelectedTh = ts.grid.headers[idxcol].el; 

解決方案是保存lastsort電網參數,如下所示加載完成後重置它。

saveColumnState = function(perm) { 
... 
    columnsState = { 
    search: this.jqGrid('getGridParam', 'search'), 
    page: this.jqGrid('getGridParam', 'page'), 
    sortname: this.jqGrid('getGridParam', 'sortname'), 
    sortorder: this.jqGrid('getGridParam', 'sortorder'), 
    lastsort: this.jqGrid('getGridParam', 'lastsort'), 
    permutation: perm, 
    colStates: { } 
    }, 
... 
}, 

loadComplete: function(data) { 
... 
    if (isColState) { 
    $this.jqGrid("remapColumns", myColumnsState.permutation, true); 
    if(myColumnsState.lastsort > -1) 
     $this.jqGrid("setGridParam", { lastsort: myColumnsState.lastsort }); 
    } 
... 
}, 
+0

剛剛有這個問題 - 感謝節省了我幾個小時的調試:) – Charles 2013-02-05 23:36:16

相關問題