日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

[转]ExtJS Grid 分页时保持选中的简单实现方法

發(fā)布時間:2025/5/22 javascript 134 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]ExtJS Grid 分页时保持选中的简单实现方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址 :http://www.qeefee.com/article/ext-grid-keep-paging-selection

ExtJS中經(jīng)常要用到分頁和選擇,但是當(dāng)選擇遇到分頁的時候,杯具就發(fā)生了,每一次翻頁,其它頁面的選中行就消失了。Ext 沒有為我們提供內(nèi)置的保持選中的支持,只有我們自己動手來實現(xiàn)了。

先說一下具體的思路吧:首先在頁面中創(chuàng)建一個數(shù)組,用來存儲Grid的所有選中行,然后分別處理selModel的select和unselect事件和Store的load事件。

  • 在select事件中,將選中的行存儲在全局?jǐn)?shù)組中
  • 在unselect事件中,將取消選中的行從數(shù)組中移除
  • 在load事件中,遍歷加載到的數(shù)據(jù),判斷哪些應(yīng)該選中

那么,首先我們來快速的創(chuàng)建一個Grid,并綁定一些分頁數(shù)據(jù):

Ext.onReady(function () {var supplierStore = Ext.create("Ext.data.Store", { fields: [ { name: "Name", type: "string" }, { name: "Phone", type: "string" }, { name: "Address", type: "string" } ], autoLoad: true, pageSize: 3, proxy: { type: "ajax", url: rootUrl + "Grid/FetchPageData", actionMethods: { read: "POST" }, reader: { type: "json", root: "data.records", totalProperty: "data.total" } } }); var grid = Ext.create("Ext.grid.GridPanel", { border: true, width: 600, height: 200, store: supplierStore, columnLines: true, enableColumnHide: false, enableColumnMove: false, enableLocking: true, selModel: Ext.create("Ext.selection.CheckboxModel", { mode: "MULTI", checkOnly: true }), columns: [ { text: "名稱", dataIndex: "Name", width: 150, sortable: false }, { text: "電話", dataIndex: "Phone", width: 150, sortable: false }, { text: "地址", dataIndex: "Address", width: 260, sortable: false } ], bbar: { xtype: "pagingtoolbar", store: supplierStore, displayInfo: true }, renderTo: Ext.getBody() }); });

服務(wù)器段的代碼:

public JsonResult FetchPageData() {int pageIndex = Convert.ToInt32(Request["page"]); int pageSize = Convert.ToInt32(Request["limit"]); OperateResult result = new OperateResult(); var pageData = SupplierModel.SupplierRecords.Skip((pageIndex - 1) * pageSize).Take(pageSize); result.Set(true, new { records = pageData, total = SupplierModel.SupplierRecords.Count }); return Json(result); }

這里面用到的SupplierModel代碼如下:

public class SupplierModel {public string Name { get; set; } public string Phone { get; set; } public string Address { get; set; } public static List<SupplierModel> SupplierRecords = null; static SupplierModel() { SupplierRecords = new List<SupplierModel>(); SupplierRecords.Add(new SupplierModel() { Name = "北京電信", Phone = "10000", Address = "北京市XX區(qū)XX路" }); SupplierRecords.Add(new SupplierModel() { Name = "北京移動", Phone = "10086", Address = "北京市XX區(qū)XX路" }); SupplierRecords.Add(new SupplierModel() { Name = "北京聯(lián)通", Phone = "10010", Address = "北京市XX區(qū)XX路" }); SupplierRecords.Add(new SupplierModel() { Name = "北京鐵通", Phone = "", Address = "北京市XX區(qū)XX路" }); SupplierRecords.Add(new SupplierModel() { Name = "北京郵政", Phone = "95599", Address = "北京市XX區(qū)XX路" }); } }

硬編碼了一些數(shù)據(jù),如果我們每頁顯示3行,還是能夠分頁的。

然后運行程序,看看我們的界面吧:

接下來看看我們要完成的分頁保持選中。

第一步,添加一個全局的數(shù)據(jù),用來保存選中的數(shù)據(jù)

var AllSelectedRecords = [];

第二步,為selModel添加select事件

listeners: {select: function (me, record, index, opts) {AllSelectedRecords.push(record);} }

第三步,為selModel添加unselect事件

deselect: function (me, record, index, opts) { AllSelectedRecords = Ext.Array.filter(AllSelectedRecords, function (item) { return item.get("Name") != record.get("Name"); }); },

第四步,store添加load事件

listeners: {load: function (me, records, success, opts) {if (!success || !records || records.length == 0)return; //根據(jù)全局的選擇,初始化選中的列 var selModel = grid.getSelectionModel(); Ext.Array.each(AllSelectedRecords, function () { for (var i = 0; i < records.length; i++) { var record = records[i]; if (record.get("Name") == this.get("Name")) { selModel.select(record, true, true); //選中record,并且保持現(xiàn)有的選擇,不觸發(fā)選中事件 } } }); } },

完成這四個步驟以后,我們來看一下完整的代碼:

Ext.onReady(function () {var supplierStore = Ext.create("Ext.data.Store", { fields: [ { name: "Name", type: "string" }, { name: "Phone", type: "string" }, { name: "Address", type: "string" } ], autoLoad: true, pageSize: 3, listeners: { load: function (me, records, success, opts) { if (!success || !records || records.length == 0) return; //根據(jù)全局的選擇,初始化選中的列 var selModel = grid.getSelectionModel(); Ext.Array.each(AllSelectedRecords, function () { for (var i = 0; i < records.length; i++) { var record = records[i]; if (record.get("Name") == this.get("Name"//選中record,并且保持現(xiàn)有的選擇,不觸發(fā)選中事件 } } }); } }, proxy: { type: "ajax", url: rootUrl + "Grid/FetchPageData", actionMethods: { read: "POST" }, reader: { type: "json", root: "data.records", totalProperty: "data.total" } } }); var AllSelectedRecords = []; var grid = Ext.create("Ext.grid.GridPanel", { border: true, width: 600, height: 200, store: supplierStore, columnLines: true, enableColumnHide: false, enableColumnMove: false, enableLocking: true, selModel: Ext.create("Ext.selection.CheckboxModel", { mode: "MULTI", listeners: { deselect: function (me, record, index, opts) { AllSelectedRecords = Ext.Array.filter(AllSelectedRecords, function (item) { return item.get("Name") != record.get("Name"); }); }, select: function (me, record, index, opts) { AllSelectedRecords.push(record); } } }), columns: [ { text: "名稱", dataIndex: "Name", width: 150, sortable: false }, { text: "電話", dataIndex: "Phone", width: 150, sortable: false }, { text: "地址", dataIndex: "Address", width: 260, sortable: false } ], bbar: { xtype: "pagingtoolbar", store: supplierStore, displayInfo: true }, renderTo: Ext.getBody() }); });

然后再次運行程序,試試翻頁的選中的效果吧,少年,這樣就輕松的實現(xiàn)了分頁的選中。這樣做的優(yōu)點的非常的靈活,可以在頁面中自由的使用,缺點也很明 顯,他并不能夠復(fù)用,如果你在別的Grid中使用,那就要繼續(xù)再定義一個全局變量,以后的章節(jié)中我們會完成一個封裝好的grid。

總結(jié)

以上是生活随笔為你收集整理的[转]ExtJS Grid 分页时保持选中的简单实现方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。