【问题标题】:JQGrid: Resetting the Columns to original Order and stateJQGrid:将列重置为原始顺序和状态
【发布时间】:2016-02-17 07:44:24
【问题描述】:

我正在使用带有选项sortable:true 的jqGrid,并且还使用了columnChooser 插件。 我想创建一个重置按钮

  1. 将列重新排序为原始状态
  2. 重新添加所有可能被 columnChooser 插件隐藏的列。我可以使用here提供的答案来完成这一点

但是,如何完成将列重新排序为原始状态的第一点。

【问题讨论】:

  • 我认为这个演示一定很有帮助。 ok-soft-gmbh.com/jqGrid/SimpleLocalGridWithSetColumn.htm
  • 是的,使用演示中的相同示例,我可以获得所有列。但是,我无法将列重新排序为原始状态。演示没有列重新排序
  • 您可以将 colModel 保存在一个变量中,然后当您想恢复原始状态时,只需使用 colModel 数据
  • stackoverflow.com/questions/6040550/…这里的答案有用吗?
  • 我已经做了与问题中提到的相同的事情。但是,遗憾的是它不会重置列排序

标签: jquery jqgrid


【解决方案1】:

恢复所有列的hidden 状态非常简单,您已经找到了相应的代码示例。因此我回答了如何重置列顺序。

问题在于可用于对列重新排序的方法remapColumns 使用列号而不是列名。 jqGrid的许多其他方法或内部参数也存在同样的问题。要使用方法remapColumns,您需要使用基于当前索引顺序的列索引。在用户多次更改列的顺序后,很难提供您想要相对于当前列顺序的列号。 保存列的名称而不是列索引会容易得多。

在 Tony 更改 jqGrid 的许可协议并将其重命名为 Guriddo jqGrid JS 后,我将 free jqGrid 开发为 jqGrid 的一个分支。我在 jqGrid 中实现了许多改变,这让我感到不安,并实现了许多新功能。其中一项更改是将所有内部选项移动到保存名称而不是索引,而不会破坏与先前版本的兼容性。我添加了方法remapColumnsByName,它简化了列重映射的使用(参见the answerthe demo)。

在免费的 jqGrid 中实现您的要求可能非常简单。您只需将原始列顺序保存在数组中,然后将其用作remapColumnsByName 的参数即可重置列

$("#grid1").jqGrid({
    ...
    onInitGrid: function () {
        var p = $(this).jqGrid("getGridParam");
        // save names of columns in custom option of jqGrid
        p.originalColumnOrder = $.map(p.colModel, function (cm) {
            return cm.name;
        });
        //alert(JSON.stringify(p.originalColumnOrder));
    }
}).jqGrid("navGrid", { add: false, edit: false, del: false })
.jqGrid("navButtonAdd", {
    buttonicon: "fa-repeat",
    caption: "",
    title: "Reset original column order",
    onClickButton: function () {
        var $self = $(this), p = $self.jqGrid("getGridParam");
        $self.jqGrid("remapColumnsByName", p.originalColumnOrder, true);
    }});

查看演示https://jsfiddle.net/OlegKi/r6b2os5b/2/

如果由于某些原因您无法迁移到免费的 jqGrid,那么您必须模拟相同的行为。您应该将原始列顺序保存为列名数组,然后在调用remapColumns 之前直接将名称转换为索引。它也应该可以工作。

【讨论】:

    【解决方案2】:

    将列重新排序为原始状态

    我刚遇到这个问题,我已经用一个简单的javascript函数实现了这个功能。

    首先获取网格初始化时的列顺序:

    var initialcolumnorder = $("#Grid").getGridParam('colNames');
    

    在需要的地方调用下面的函数,以initialcolumnorder为参数

    function resetColumnOrder(initialcolumnorder)
    {  
         var currentColumnOrder = $("#Grid").getGridParam('colNames');
         var columnMappingArray = [];
         $.each(initialcolumnorder, function (index, value) {
             var currentIndex = $.inArray(value, currentColumnOrder);
             columnMappingArray.push(currentIndex);   
         });
    
         $("#Grid").remapColumns(columnMappingArray, true, false);
    }
    

    【讨论】:

      【解决方案3】:

      根据我在讨论中阅读的一些答案,我能够使用我们的网格创建一个“重置列”功能(我很想表扬,但这是针对不同问题的许多不同解决方案的拼凑而成,并且我没有跟踪他们)。

      它将恢复可见性、列顺序和冻结状态。如果通过新的列菜单功能修改了列状态,也可以使用。

      (dgColModel 是一个全局变量,包含我原来的 colModel)

      function resetColumns(grid) {
        //remapArray: 0 is the rownumber, 1 is the selection checkbox
        var i = 0, cmi, l = dgColModel.length, remapArray = [0, 1]; 
        for (; i < l; i++){
          cmi = dgColModel[i];
          if (typeof cmi.hidden === 'undefined' || cmi.hidden === false){
            grid.jqGrid('showCol', cmi.name);
          } else {
            grid.jqGrid('hideCol', cmi.name);
          }
          if (typeof cmi.frozen === 'undefined' || cmi.frozen === false){
            grid.jqGrid('setColProp', cmi.name, { frozen: false });
          } else {
            grid.jqGrid('setColProp', cmi.name, { frozen: true });
          }
          remapArray.push(getColumnIndexByName(grid, cmi.name));
        }
        grid.jqGrid("destroyFrozenColumns");
        grid.remapColumns(remapArray, true);
        grid.jqGrid("setFrozenColumns");
      }
      
      function getColumnIndexByName(grid, columnName)
      {
        var cm = grid.jqGrid('getGridParam','colModel'),i=0,l=cm.length;
        for (; i<l; i++) {
          if (cm[i].name===columnName) {
              return i; // return the index
          }
        }
        return -1;
      };
      

      希望这可以成为一个实际的网格函数(当网格被实例化时,colModel 可能会保持不变),但同时它工作得很好。

      我希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 2015-05-20
        • 1970-01-01
        相关资源
        最近更新 更多