2011-04-21 43 views
6

看來在這方面有幾個關於這個問題的問題,他們有一些很好的答案,但似乎我的情況有點不同。我需要過濾jqGrid中顯示的記錄,但完全是客戶端。jqGrid Filtering Records

由於多種原因,我填充網格的最佳方式是直接將數組發送到頁面上的JavaScript中。網格本身根本不與服務器交互。我有一些自定義的AJAX發生在各種網格事件中,但就是這樣。 (基本上,我正在將這與現有的一組可用服務集成在一起,這些服務不會發生顯着變化。)

我正在做的是根據簡單的文本輸入和按鈕過濾網格。我的頁面上有文本輸入,按鈕和一個表格(它成爲文檔準備好的網格)。我想綁定到按鈕的click事件(正常的jQuery事件綁定,沒有什麼特別的),並使用來自文本輸入的值作爲jqGrid上的顯示過濾器。

「filter」我的意思是隻顯示包含輸入文本匹配(在任何字段中)的記錄。然後,要顯示所有記錄,只需清空輸入並再次點擊按鈕。另外,網格是多選的,選擇需要通過過濾持續。我只需要能夠隱藏與輸入內容不匹配的行。

這可能嗎?

回答

20

要過濾本地網格,您應該只填寫filters屬性jgGrid的postData參數,並另外設置search:true

要保存網格的選擇,您可以使用reloadGrid並附加參數[{page:1,current:true}](請參閱here)。

相應的代碼可以是下列

$("#search").click(function() { 
    var searchFiler = $("#filter").val(), grid = $("#list"), f; 

    if (searchFiler.length === 0) { 
     grid[0].p.search = false; 
     $.extend(grid[0].p.postData,{filters:""}); 
    } 
    f = {groupOp:"OR",rules:[]}; 
    f.rules.push({field:"name",op:"cn",data:searchFiler}); 
    f.rules.push({field:"note",op:"cn",data:searchFiler}); 
    grid[0].p.search = true; 
    $.extend(grid[0].p.postData,{filters:JSON.stringify(f)}); 
    grid.trigger("reloadGrid",[{page:1,current:true}]); 
}); 

我爲你做the demo的兩列「客戶」(「名稱」)和「注意事項」(「筆記」),該過濾器可以延長碼在所有需要的列中搜索。

取決於您的確切意思與保存行選擇,您可能需要將selarrrow中的當前選擇保存在變量中,並根據setSelection方法恢復所選行。

+1

這看起來不錯,謝謝!有幾件奇怪的事情正在發生。 1:在我的客戶端提供的環境中,IE 8(我的項目的唯一目標瀏覽器,客戶端訂單)中表示「JSON」未定義。但它不會在你的演示中在同一個瀏覽器上說這個。 2:在你設置的演示中,它不保存在過濾之間的行選擇。選擇,隱藏,然後取消隱藏的行不再被選中。然而,在實現這一點的同時,我有一個想法,可以更簡單,更本地與jqGrid ... – David 2011-04-21 22:30:58

+0

如果,而不是過濾主網格,過濾功能彈出一個jQuery UI模式對話框(簡單)自己的網格,它顯示過濾的記錄(我可以很容易地使用'grid1'中過濾的數據集填充'grid2'?我想最糟糕的情況是我複製數組和過濾器在一個循環與普通JS之前設置爲數據' grid2')。然後用戶選擇他們想要的並關閉模態對話框。關閉時,我從'grid2'(簡單)中獲取選定的ID,並將它們設置爲在'grid1'中選擇(方便,演示在jqGrid站點上)。當然,清除'grid2'。思考? – David 2011-04-21 22:34:22

+1

@David:你有''JSON'未定義'錯誤,因爲你沒有包含[json2.js](https://github.com/douglascrockford/JSON-js)。如果安裝了更新[976662](http://support.microsoft.com/kb/976662),則IE8也支持「JSON」類。我建議你總是包含json2.js以確保'JSON.stringify'工作。 – Oleg 2011-04-22 05:20:29