0

フィルタリングを実装した大きなリストがあります。ユーザーがいくつかの行を選択し、リストをフィルタリングし、さらにいくつかを選択し、フィルターを変更し、さらに選択し、すべての選択を残すことができるようにしたいと考えています。

私はこの例に従っています: http://mleibman.github.com/SlickGrid/examples/example4-model.html

私の問題を確認するには、次の手順に従ってください。

  1. 0行をクリック
  2. 10 行を Shift キーを押しながらクリックします。行 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 に答える