在启用过滤器时,slickgrid选择行会忘记以前的选择

时间:2012-08-31 14:14:19

标签: slickgrid

我有一个很大的列表,我已经实现了过滤。我想用户能够选择一些行,过滤列表,选择更多行,更改过滤器,选择更多行,并保留所有选择。

我关注这个例子: http://mleibman.github.com/SlickGrid/examples/example4-model.html

按照以下步骤查看我的问题:

  1. 点击0行
  2. 按住Shift键并单击10行。现在选择0到10行。
  3. 将滑块向上移动约90%,因此只显示0-10行中的几行。 (对我来说,2,6和8仍然显示并仍然被选中。)
  4. 按住Ctrl键并单击未选中的行(对我来说,第29行)
  5. 将过滤器向下滑回零。
  6. 现在看到这个问题了。对我来说,只选择了行2,6,8和29。我宁愿选择0到10和29。有没有选择来获得这种行为?如果没有,有人可以推荐一种可行的方法吗?

2 个答案:

答案 0 :(得分:2)

诀窍是:

  1. 为每个选定的行保存一些指示
  2. 在构建过滤后的数据时,请注意在数组中选择了哪些行
  3. 在“setGridData”
  4. 之后调用“setSelectedRows”

    这是执行此操作的代码。

    // filter grid without harming selection
    // grid: a SlickGrid Object
    // filter: a function that receieves a "data row" and returns true if it meets the filter
    function filterGrid(grid,filter) {
        var oldline;
        var olddata=grid.getData();
        var oldselection=grid.getSelectedRows()
    
        var newline=0;
        var newdata=[];
        var newselection=[];
    
        for (oldline=0; oldline<olddata.length ; oldline++ ) {
          if (filter(olddata[oldline]) {
            newdata.push(olddata[oldline]);
            if (oldselection.indexOf(oldline)>-1) { // note on condition: ECMA5 - in IE8 you will need to loop
              newselection.push(newline);
              newline++;
            }
          }
        }
    
        grid.setData(newdata);
        grid.setSelectedRows(newselection);
        grid.updateRowCount();
        grid.render();      
    }
    

    请注意,此代码不会保留未通过过滤器的选定行。

答案 1 :(得分:2)

此问题已在Github上解决。

  • 首先,将一个变量添加到商店ID。
    • var selectedIds = [];
  • 第二,修改syncGridSelection
    • DataView.syncGridSelection(grid,true,true,function(syncIds){selectedIds = syncIds;});