2012-08-31 93 views
0

我有一個大的列表,我已經實現了過濾。我希望用戶能夠選擇一些行,過濾列表,選擇更多,更改過濾器,選擇更多,並保留所有選擇。slickgrid選擇行而過濾器忘記以前的選擇

我下面這個例子: http://mleibman.github.com/SlickGrid/examples/example4-model.html

按照下列步驟來看看我的問題:

  1. 點擊0行的10列
  2. 按住Shift鍵單擊。現在選擇0到10行。
  3. 將滑塊上移至約90%,因此只顯示0-10行中的幾個。 (對我來說,2,6和8仍然顯示並仍然被選中)
  4. 按住Ctrl鍵並點擊未選擇的行(對於我來說,第29行)
  5. 將過濾器滑回到零。

現在看到了這個問題。對我而言,只有第2,6,8和29行被選中。我寧願選擇0到10和29。有沒有一個選擇來獲得這種行爲?如果沒有,有人可以推薦一種可行的方法嗎?

回答

2

此問題已在Github上解決。

  • 首先,添加一個變量來存儲id。
    • var selectedIds = [];
  • 其次,modifiy syncGridSelection
    • DataView.syncGridSelection(網格,真實的,真實的,功能(syncIds){selectedIds = syncIds;});
2

訣竅是:

  1. 保存一些指示爲每個選定的行
  2. 當你建立這行
  3. 呼叫「setSelectedRows」後「setGridData陣列中的選擇的過濾數據,記「

這是做它的代碼。

// 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();  
} 

請注意,此代碼不會保留未通過過濾器的選定行。

+0

這被固定一個月前:[修正#498 - 選擇濾波時,不會總是保持](https://github.com/mleibman/SlickGrid/commit/5b13782a50315f60aa911c360ec28d8ac9f63a42)。 – idbehold

+0

不知道。我會考慮在我的項目中升級slickgrid。 –

+0

idbehold,如果您想將該鏈接發佈爲答案,我會將其標記爲正確。如果不是的話,我會自我回答,以便這個問題至少有一個答案。 –