2011-12-17 81 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

相关问题