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

ExtJS中经常要用到分页和选择,但是当选择遇到分页的时候,杯具就发生了,每一次翻页,其它页面的选中行就消失了。Ext 没有为我们提供内置的保持选中的支持,只有我们自己动手来实现了。

先说一下具体的思路吧:首先在页面中创建一个数组,用来存储Grid的所有选中行,然后分别处理selModel的select和unselect事件和Store的load事件。

  • 在select事件中,将选中的行存储在全局数组中
  • 在unselect事件中,将取消选中的行从数组中移除
  • 在load事件中,遍历加载到的数据,判断哪些应该选中

那么,首先我们来快速的创建一个Grid,并绑定一些分页数据:

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

服务器段的代码:

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区XX路" });
SupplierRecords.Add(new SupplierModel() { Name = "北京移动", Phone = "10086", Address = "北京市XX区XX路" });
SupplierRecords.Add(new SupplierModel() { Name = "北京联通", Phone = "10010", Address = "北京市XX区XX路" });
SupplierRecords.Add(new SupplierModel() { Name = "北京铁通", Phone = "", Address = "北京市XX区XX路" });
SupplierRecords.Add(new SupplierModel() { Name = "北京邮政", Phone = "95599", Address = "北京市XX区XX路" });
}
}

硬编码了一些数据,如果我们每页显示3行,还是能够分页的。

然后运行程序,看看我们的界面吧:

接下来看看我们要完成的分页保持选中。

第一步,添加一个全局的数据,用来保存选中的数据

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; //根据全局的选择,初始化选中的列
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,并且保持现有的选择,不触发选中事件
}
}
});
}
},

完成这四个步骤以后,我们来看一下完整的代码:

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; //根据全局的选择,初始化选中的列
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,并且保持现有的选择,不触发选中事件
}
}
});
}
},
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()
});
});

然后再次运行程序,试试翻页的选中的效果吧,少年,这样就轻松的实现了分页的选中。这样做的优点的非常的灵活,可以在页面中自由的使用,缺点也很明 显,他并不能够复用,如果你在别的Grid中使用,那就要继续再定义一个全局变量,以后的章节中我们会完成一个封装好的grid。

[转]ExtJS Grid 分页时保持选中的简单实现方法的更多相关文章

  1. Extjs grid分页多选记忆功能

    很多同事在用extjs grid做分页的时候,往往会想用grid的多选功能来实现导出Excel之类的功能(也就是所谓的多选记忆功能),但在选选择下一页的时候 上一页选中的已经清除 这是因为做分页的时候 ...

  2. extjs grid 分页

    在使用extjs创建带分页功能的 grid 如下: 1.创建一个模型 // 创建算定义模型 模型名称 User Ext.define('User', { extend: 'Ext.data.Model ...

  3. C#连接sqlserver分页查询的两个简单的方法

    /// <summary>        /// 分页查询函数        /// </summary>        /// <param name="co ...

  4. ExtJS入门教程06,grid分页的实现

    前面两篇内容分别介绍了extjs grid的基本用法和extjs grid异步加载数据,这篇文章将介绍extjs grid的分页. 数据量大的时候我们必须用到分页,结合上一篇的异步加载数据,今天我们就 ...

  5. ExtJS实现分页grid paging

    背景 分页查询在Web页面中比例很大,我自己也写过分页框架,也用过很多第三方分页. 基于jquery的dataTables,那么多例子.清晰API.应用广泛.开源,即使是新手也可以很快上手. ExtJ ...

  6. Javascript - ExtJs - 组件 - 分页

    服务端只需要返回如下格式的字符串,ExtJs就可以解析并自动生成分页数据.  , name: "sam" }     ] } 准备: CREATE PROCEDURE [dbo]. ...

  7. extjs grid renderer用法

    extjs grid renderer用法 摘自:http://www.cnblogs.com/ljian/archive/2011/10/27/2226959.html var cm = new E ...

  8. ExtJs4 SpringMvc3 实现Grid 分页

    新建一个Maven webapp项目,webxml以及spring配置没什么需要注意的,不再赘述. Maven依赖:(个人习惯,有用没用的都加上...) <project xmlns=" ...

  9. 72. js EXTJS grid renderer用法

    转自:https://blog.csdn.net/shancunxiaoyazhi/article/details/22156083 renderer : Function (可选的)该函数用于加工单 ...

随机推荐

  1. monggodb学习系列:1,mongodb入门

    http://note.youdao.com/share/?id=fa62cd2386f253af68a7e29c6638f158&type=note#/ 放在有道笔记上了,懒得复制过来,有兴 ...

  2. 谈谈对Spring IOC的理解(转)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  3. AlloyTouch 0.2.0发布--鱼和熊掌兼得

    原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/AlloyTouch-0.2.0 背景 公司师姐昨日在KM发了篇长文,主要结论RAF+transfo ...

  4. C++01.类的引入

    1.假设我们要输出张三,李四两个人的基本信息,包括姓名,年龄,可以用以下的C程序实现: eg: #include <stdio.h> int main(int argc,char **ar ...

  5. 浅析天猫H5站点

    前言 我们做前端开发的时候,很有可能会做一个竞品分析,比如我就做过去哪儿.艺龙.同程等与携程的移动站点竞品分析,竞品分析的目的一般是技术对比,但是更多的是业务对比,知己知彼,百战不殆:我们同时会借鉴. ...

  6. View and Data API Tips : Conversion between DbId and node

    By Daniel Du In View and Data client side API, The assets in the Autodesk Viewer have an object tree ...

  7. android SQLite数据库总结

    SQLite SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用. sql语法就 ...

  8. xamarin 一般错误解决办法

    1. android_m2repository_r错误 问题描述: Unzipping failed. Please download https://dl-ssl.google.com/androi ...

  9. java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  10. SQL Server封闭掉 触发器递归

    SQL Server关闭掉 触发器递归SQL Server  是有一个开关, 可以关闭掉 触发器递归的.EXEC sp_dboption '数据库名字', 'recursive triggers', ...