0

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

我正在关注这个例子: 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. 将过滤器滑回零。

现在看到了这个问题。对我来说,只选择了第 2、6、8 和 29 行。我希望 0 到 10 和 29 保持选中状态。有没有获得这种行为的选项?如果没有,有人可以推荐一种可能有效的方法吗?

4

2 回答 2

2

诀窍是:

  1. 为每个选定的行保存一些指示
  2. 在构建过滤数据时,请注意在数组中选择了哪些行
  3. 在“setGridData”之后调用“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();      
}

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

于 2013-01-13T13:45:57.330 回答
2

这个问题已经在Github上解决了。

  • 首先,添加一个变量来存储 id。
    • var selectedIds=[];
  • 二、修改syncGridSelection
    • DataView.syncGridSelection(grid, true, true, function(syncIds) { selectedIds = syncIds;});
于 2014-01-31T11:09:07.757 回答