• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    JavaScript的Ext JS框架中的GridPanel组件使用指南

    发布者: 嘉6148 | 发布时间: 2025-8-13 22:05| 查看数: 97| 评论数: 0|帖子模式

    1 最简单的Grid Panel
    Grid Panel是ExtJS的核心部分之一,通过Grid Panel可以对数据显示、排序、分组和编辑。Model和Store是Grid Panel处理数据的核心,每个Grid Panel都必须设置Model和Store。要创建Grid Panel,首先要定义Model,Model包括了Grid Panel所有需要显示的字段,相当于数据库中表字段的集合。Store可以看作是一行数据的集合或者是Model的实例集合,每个Store都包含一个或多个Model实例,Grid Panel显示的数据都存储在Store里面。Grid Panel通过Store获取数据并显示,Store则通过Proxy对数据进行读取和保存。
    下面创建一个Grid Panel用来显示用户的基本信息,包括用户名、邮箱、手机号(name、email、phone),首先创建用户模型(User Model)。
    1. Ext.define('User', {
    2. extend: 'Ext.data.Model',
    3. fields: [ 'name', 'email', 'phone' ]
    4. });
    复制代码
    接下来创建Store,Store是User的集合,包括多个User实例。
    1. var userStore = Ext.create('Ext.data.Store', {
    2. model: 'User', //刚才创建的User Model
    3. data: [
    4. { name: 'Lisa', email: 'lisa@simpsons.com', phone: '555-111-1224' },
    5. { name: 'Bart', email: 'bart@simpsons.com', phone: '555-222-1234' },
    6. { name: 'Homer', email: 'home@simpsons.com', phone: '555-222-1244' },
    7. { name: 'Marge', email: 'marge@simpsons.com', phone: '555-222-1254' }
    8. ]
    9. });
    复制代码
    Model和Store都创建好之后,就可以创建Grid Panel了。
    1. Ext.create('Ext.grid.Panel', {
    2. renderTo: Ext.getBody(),
    3. store: userStore, //绑定上面创建的Store
    4. width: 400,
    5. height: 200,
    6. title: 'Application Users',
    7. columns: [
    8. {
    9. text: 'Name',
    10. width: 100,
    11. sortable: false,
    12. hideable: false,
    13. dataIndex: 'name' //Grid Panel中显示的字段,必须要和User Model中的字段一致
    14. },
    15. {
    16. text: 'Email Address',
    17. width: 150,
    18. dataIndex: 'email',
    19. hidden: true
    20. },
    21. {
    22. text: 'Phone Number',
    23. flex: 1,
    24. dataIndex: 'phone'
    25. }
    26. ]
    27. });
    复制代码
    最后创建的用户Grid Panel如图所示。



    2 Grid Panel数据分组(Grouping)
    只要在Store中设置groupField属性,就可以对Grid Panel显示的数据进行分组。假设公司有很多员工,需要对公司的员工在Grid Panel中按部门进行分组显示。首先在Store中设置groupField属性为department。
    1. Ext.create('Ext.data.Store', {
    2. model: 'Employee',
    3. data: ...,
    4. groupField: 'department' //设置数据按照department分组
    5. });
    复制代码
    然后在Grid Panel中添加grouping Feature,实现分组显示效果。
    1. Ext.create('Ext.grid.Panel', {
    2. ...
    3. features: [{ ftype: 'grouping' }]
    4. });
    复制代码
    分组显示效果如下图所示,点击这里查看官方分组显示代码。


    3 Grid Panel分页显示
    当数据比较多一页显示不完的时候,就需要对数据进行分页显示。Grid Panel可以通过Paging Toolbar和Paging Scroller两种方式实现分页显示显示,Paging Toolbar有上一页/下一页按钮,Paging Scroller是当Grid Panel滚动显示到底部的时候动态加载数据。
    要实现分页显示,首先要设置Store支持分页,在Store中设置pageSize,pageSize默认是25。在reader中设置数据总数量totalProperty,分页插件根据pageSize和totalProperty进行分页。下面的代码pageSize设置为4,totalProperty则从返回的json数据中total属性获取。
    1. Ext.create('Ext.data.Store', {
    2. model: 'User',
    3. autoLoad: true,
    4. pageSize: 4, //设置每页显示的数据数量
    5. proxy: {
    6. type: 'ajax',
    7. url : 'data/users.json',
    8. reader: {
    9. type: 'json',
    10. root: 'users', //指定从json的哪个属性获取数据,如果不指定,则从json的跟属性获取
    11. totalProperty: 'total' //总数据数量
    12. }
    13. }
    14. });
    复制代码
    假设json数据格式如下
    1. {
    2. "success": true,
    3. "total": 12,
    4. "users": [
    5. { "name": "Lisa", "email": "lisa@simpsons.com", "phone": "555-111-1224" },
    6. { "name": "Bart", "email": "bart@simpsons.com", "phone": "555-222-1234" },
    7. { "name": "Homer", "email": "home@simpsons.com", "phone": "555-222-1244" },
    8. { "name": "Marge", "email": "marge@simpsons.com", "phone": "555-222-1254" }
    9. ]
    10. }
    复制代码
    Store的分页已经设置完毕,下面在Grid Panel中实现Paging Toolbar分页功能。
    1. Ext.create('Ext.grid.Panel', {
    2. store: userStore,
    3. columns: ...,
    4. dockedItems: [{
    5. xtype: 'pagingtoolbar', //在Grid Panel中添加paging toolbar
    6. store: userStore, //把paging toolbar的Store设置成和Grid Panel的Store一样
    7. dock: 'bottom',
    8. displayInfo: true
    9. }]
    10. });
    复制代码
    Paging Toolbar的分页效果如下图所示,点击这里查看官方Paging Toolbar分页功能代码。


    Paging Scroller的分页实现比较简单,只要在Grid Panel中设置如下代码即可,点击这里查看官方Paging Scroller分页功能代码。
    1. Ext.create('Ext.grid.Panel', {
    2. //使用Paging Scroller分页插件
    3. verticalScroller: 'paginggridscroller',
    4. // do not reset the scrollbar when the view refreshs
    5. invalidateScrollerOnRefresh: false,
    6. // infinite scrolling does not support selection
    7. disableSelection: true,
    8. // ...
    9. });
    复制代码
    4 Grid Panel添加Checkbox
    只要设置Grid Panel的selModel属性为Ext.selection.CheckboxModel,点击这里查看官方代码实例。
    1. Ext.create('Ext.grid.Panel', {
    2. selModel: Ext.create('Ext.selection.CheckboxModel'), //设置Grid Panel的选择模式为Checkbox
    3. store: userStore,
    4. columns: ...
    5. });
    复制代码
    5 综合示例
    1. var grid = new Ext.grid.GridPanel({
    2. store //数据源
    3. cm //Ext.grid.columnModel
    4. columns //功能和Ext.grid.columnModel一样。与cm有一个就行
    5. autoWidth:true
    6. width
    7. title
    8. border:false
    9. columnLines: true,
    10. renderTo //显示div标签的id
    11. animCollapse:false //True 表示为面板闭合过程附有动画效果 (默认为true,在类 Ext.Fx 可用的情况下).
    12. collapsible: true, //true 表示面板可以闭合
    13. columnLines:true, //true 表示有格边框
    14. loadMask:true //获取数据里时有等待界面
    15. stripeRows: true, //双色表格
    16. plugins:true,
    17. bbar:new Ext.PagingToolbar({
    18. pageSize:10,
    19. store:store, //数据源
    20. displayInfo:true, //为true时下面的才显示
    21. displayMsg:'显示第 {0} 条到 {1} 条记录,一共 {2} 条',
    22. emptyMsg:'没有记录'
    23. }),
    24. tbar:[{
    25. text:'查询',
    26. icon:'/trade/images/delete.gif',
    27. cls:'x-btn-text-icon',
    28. handler:function(){win.show();}
    29. }
    30. })
    复制代码
    1. //**********************************************
    2. //PagingToolbar分页
    3. //传到服务器数据 start开始查询位置, limit要查询多少条
    4. //排序
    5. //服务器 sort,dir
    6. //**********************************************
    7. var com = new Ext.grid.ColumnModel([
    8. new Ext.grid.RowNumberer(),
    9. {header: "客户ID", width: 50, sortable: true, dataIndex: 'memid'},
    10. {header: "客户姓名", width: 75, sortable: true, dataIndex: 'memName'},
    11. {header:'姓别', width:50, dataIndex:'sex', align:'center', sortable:true, renderer:function(v){return (v == '1')?'<img src="images/user_suit.png">':'<img src="images/user_female.png">';}}
    12. {header: '跟踪号',width:150,dataIndex:'code'},
    13. {header: '日期', width:150, dataIndex: 'kd_time'}
    14. ]);
    复制代码
    1. /***********************************************
    2. grid tbar
    3. 样式
    4. cls:'x-btn-text-icon' 添加
    5. **************************************************/
    6. EditorGridPanel
    7. chickToEdit:1 //点击次数
    8. ColumnModel 中要加editor editor:new Ext.form.TextField({
    9. })
    10. //获取修改后的数据
    11. var storeEdit = grid.getStore(); //
    12. var modified = storeEdit.modified.slice(0); //
    13. Ext.each(modified,function(m){
    14. alert(m.data.id);  //数据就在m.data中 id 为字段名
    15. })
    复制代码
    1. //获取grid数据
    2. var selModel = grid.getSelectionModel(); 获取选择模式
    3. var record;
    4. if(!selModel.hasSelection()){
    5. Ext.Msg.alert('警告','请选择要修改的行!');
    6. return;
    7. }
    8. selModel.getSelections().length; //选择的行数

    9. record = selModel.getSelected(); //获取选择行的数据
    复制代码
    (1)获取数据 :
    单行  
    1. id = record.get('id');
    复制代码
    或者  
    1. id = record.data.id;
    复制代码
    多行  
    1. record[i].get('ddd')
    复制代码
    (2)删除数据 :
    1. var obj = grid.getSelectionModel().getSelected();
    2. store.remove(obj);
    3. grid.getView().refresh();
    复制代码
    (3)查询  
    1. store.baseParams['memid'] = fb.form.findField('memid').getValue();
    2. store.baseParams['start'] = 0;
    3. store.load();
    复制代码
    (4)添加一行列 :
    Ext自己带的一个插件  
    需要文件 RowExpander.js  
    1. var expand = new Ext.ux.grid.RowExpander({
    2. tpl : new Ext.Template(
    3. '<p>{address}</p>'
    4. )
    5. });
    复制代码
    在grid的columns中加 expand,  
    并在grid属性中加 plugins: expand


    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表