[转]ExtJS Grid 分页时保持选中的简单实现方法
原文地址 :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 分页时保持选中的简单实现方法的更多相关文章
- Extjs grid分页多选记忆功能
很多同事在用extjs grid做分页的时候,往往会想用grid的多选功能来实现导出Excel之类的功能(也就是所谓的多选记忆功能),但在选选择下一页的时候 上一页选中的已经清除 这是因为做分页的时候 ...
- extjs grid 分页
在使用extjs创建带分页功能的 grid 如下: 1.创建一个模型 // 创建算定义模型 模型名称 User Ext.define('User', { extend: 'Ext.data.Model ...
- C#连接sqlserver分页查询的两个简单的方法
/// <summary> /// 分页查询函数 /// </summary> /// <param name="co ...
- ExtJS入门教程06,grid分页的实现
前面两篇内容分别介绍了extjs grid的基本用法和extjs grid异步加载数据,这篇文章将介绍extjs grid的分页. 数据量大的时候我们必须用到分页,结合上一篇的异步加载数据,今天我们就 ...
- ExtJS实现分页grid paging
背景 分页查询在Web页面中比例很大,我自己也写过分页框架,也用过很多第三方分页. 基于jquery的dataTables,那么多例子.清晰API.应用广泛.开源,即使是新手也可以很快上手. ExtJ ...
- Javascript - ExtJs - 组件 - 分页
服务端只需要返回如下格式的字符串,ExtJs就可以解析并自动生成分页数据. , name: "sam" } ] } 准备: CREATE PROCEDURE [dbo]. ...
- extjs grid renderer用法
extjs grid renderer用法 摘自:http://www.cnblogs.com/ljian/archive/2011/10/27/2226959.html var cm = new E ...
- ExtJs4 SpringMvc3 实现Grid 分页
新建一个Maven webapp项目,webxml以及spring配置没什么需要注意的,不再赘述. Maven依赖:(个人习惯,有用没用的都加上...) <project xmlns=" ...
- 72. js EXTJS grid renderer用法
转自:https://blog.csdn.net/shancunxiaoyazhi/article/details/22156083 renderer : Function (可选的)该函数用于加工单 ...
随机推荐
- python 数据类型---列表使用之三
1. 判断列表中是否存在一个元素: "in" 的使用 list = ['Frank', 99, 'is',78, 7,3,4,'smart'] print(99 in list) ...
- 分享一个php邮件库——swiftmailer
最近看到一个好的php邮件库,与phpmailer作用一样,但性能比phpmailer好,尤其是在处理附件的能力上,发送邮件成功的几率也高. github地址:https://github.com/s ...
- Maven自定义绑定插件目标:创建项目的源码jar
<build> <plugins> <!-- 自定义绑定,创建项目的源码jar --> <plugin> <groupId>org.apac ...
- Linux网络查看命令
1.ifconfig 查看当前生效的网卡. 2.ifdown ifup 网卡禁用与启动. 3.netstat -tuln 查看当前tcp/udp通讯端口连接情况. 4.netstat -an 查看当前 ...
- spring和struts2的整合的xml代码
导入spring的pring-framework-4.0.4.RELEASE的所有包,导入struts2下(对于初学的推荐)bin下所有的包,虽然有些包可以能现在你用不到,但可以保证你基本上不会出现缺 ...
- SharePoint 2013 通过JavaScript实现列表标题列宽度可拖动
前言 最近有个新需求,用户希望标题栏可以拖动宽度,其实觉得没什么用,既然用户要了又推不掉,就勉为其难实现一下吧. 其实原理比较简单,就是利用JavaScript对标题栏进行宽度控制,然后从网上搜了一下 ...
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
- 利用私有的库MobileCoreServices检测正在安装的应用
利用的私有库检测正在安装的app 分为两步:第一,通过placeholderApplications获得所有的正在安装的app的信息 第二,遍历正在安装的app的信息,根据名称获得你想检测的app是否 ...
- ADT - Eclipse 常用快捷键
ADT - Eclipse 常用快捷键 Alt + / : 自动补全 F3 : 打开类的源码 Ctrl + D : 删除选中行 Ctrl + 1 : 自动弹出修改建议 Ctrl + Shift + J ...
- Listview的Item中有CheckBox、Button等的焦点处理
ListView的item布局中有CheckBox.Button等会获取焦点的控件会抢走焦点,造成ListView的item点击事件相应不了. 解决方法:控件设置 android:clickable= ...