ExtJS4学习笔记(九)---ExtJS4 EditGrid(可编辑的Grid)

上一篇文章,在Grid中加入了多选/全选功能(链接地址是:http://www.mhzg.net/a/20115/20115311100255.html),实际运用中,我们可能需要动态修改Grid中的数据,也就是要实现EditGrid功能。本文介绍如何实现Extjs4 EditGrid功能。先发几张效果图。看图说话,更有说服力哦。






 

HTML代码:

 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>ExtJS4 EditGrid(可编辑的Grid)-MHZG.NET</title>
  6. <link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />
  7. <link rel="stylesheet" type="text/css" href="../../examples/ux/css/CheckHeader.css" />
  8. <style type="text/css">
  9.         #search-results a {
  10.             color: #385F95;
  11.             font:bold 11px tahoma, arial, helvetica, sans-serif;
  12.             text-decoration:none;
  13.         }
  14.         .add {
  15.             background-image:url(../../examples/shared/icons/fam/cog.gif) !important;
  16.         }
  17.         #search-results a:hover {
  18.             text-decoration:underline;
  19.         }
  20.         
  21.         #search-results p {
  22.             margin:3px !important;
  23.         }
  24.         
  25.         .search-item {
  26.             font:normal 11px tahoma, arial, helvetica, sans-serif;
  27.             padding:3px 10px 3px 10px;
  28.             border:1px solid #fff;
  29.             border-bottom:1px solid #eeeeee;
  30.             white-space:normal;
  31.             color:#555;
  32.         }
  33.         .search-item h3 {
  34.             display:block;
  35.             font:inherit;
  36.             font-weight:bold;
  37.             color:#222;
  38.         }
  39.         .search-item h3 span {
  40.             float: right;
  41.             font-weight:normal;
  42.             margin:0 0 5px 5px;
  43.             width:100px;
  44.             display:block;
  45.             clear:none;
  46.         }
  47.         
  48.         .x-form-clear-trigger {
  49.             background-image: url(../../resources/themes/images/default/form/clear-trigger.gif);
  50.         }
  51.         
  52.         .x-form-search-trigger {
  53.             background-image: url(../../resources/themes/images/default/form/search-trigger.gif);
  54.         }
  55.     </style>
  56. <script type="text/javascript" src="../../bootstrap.js"></script>
  57. <script type="text/javascript" src="../../locale/ext-lang-zh_CN.js"></script>
  58. <script type="text/javascript" src="editgrid.js"></script>
  59. </head>
  60. <body>
  61. <div id="demo"></div>
  62. </body>
  63. </html>

editgrid.js:

 
  1. Ext.Loader.setConfig({enabled: true});
  2. Ext.Loader.setPath('Ext.ux''../../examples/ux');
  3. Ext.require([
  4.     'Ext.grid.*',
  5.     'Ext.toolbar.Paging',
  6.     'Ext.util.*',
  7.     'Ext.data.*',
  8.     'Ext.state.*',
  9.     'Ext.form.*',
  10.     'Ext.ux.form.SearchField',
  11.     'Ext.selection.CellModel',
  12.     'Ext.ux.CheckColumn',
  13.     'Ext.selection.CheckboxModel'
  14. ]);
  15. Ext.onReady(function(){
  16.     var isEdit = false;
  17.     
  18.     function formatDate(value){
  19.         return value ? Ext.Date.dateFormat(value, 'Y-m-d') : '';
  20.     }
  21.     
  22.     Ext.define('MyData',{
  23.         extend: 'Ext.data.Model',
  24.         fields: [
  25.             {name:'id'},
  26.             {name:'title',type:'string'},
  27.             {name:'author'},
  28.             {name:'hits',type: 'int'},
  29.             {name:'addtime',type:'date',dataFormat:'Y-m-d'},
  30.             {name:'checked',type:'bool'}
  31.         ]
  32.     });
  33.     
  34.     //创建数据源
  35.     var store = Ext.create('Ext.data.Store', {
  36.         //分页大小
  37.         pageSize: 50,
  38.         model: 'MyData',
  39.         //是否在服务端排序
  40.         remoteSort: true,
  41.         autoDestroy: true,
  42.         proxy: {
  43.            //异步获取数据,这里的URL可以改为任何动态页面,只要返回JSON数据即可
  44.             type: 'ajax',
  45.             url: 'editgrid.asp',
  46.             
  47.             reader: {
  48.                 root: 'items',
  49.                 totalProperty  : 'total'
  50.             },
  51.             simpleSortMode: true
  52.         },
  53.         sorters: [{
  54.             //排序字段。
  55.             property: 'hits',
  56.             //排序类型,默认为 ASC
  57.             direction: 'DESC'
  58.         }]
  59.     });
  60.     //下拉框数据,测试数据。
  61.     var cbstore = Ext.create('Ext.data.Store', { 
  62.     fields: ['id''name'], 
  63.     data : [ 
  64.         {"id":"1","name":"佚名"},
  65.         {"id":"2","name":"管理员"},
  66.         {"id":"3","name":"编辑"},
  67.         {"id":"4","name":"总编辑"},
  68.         {"id":"5","name":"测试员"}
  69.     ]
  70. }); 
  71.     
  72.     //创建多选
  73.      var selModel = Ext.create('Ext.selection.CheckboxModel');
  74.      var cellEditing = Ext.create('Ext.grid.plugin.CellEditing', {
  75.         clicksToEdit: 1
  76.      });
  77.     //创建Grid
  78.     var grid = Ext.create('Ext.grid.Panel',{
  79.         store: store,
  80.         selModel: selModel,
  81.         columnLines: true,
  82.         columns: [{
  83.             id:"title",
  84.             header: "标题"
  85.             width: 110, 
  86.             dataIndex: 'title'
  87.             sortable: true,
  88.             field: {
  89.                 allowBlank: false
  90.             }
  91.         },{
  92.             header: "作者",
  93.             width: 120, 
  94.             dataIndex: 'author'
  95.             id:'gc',
  96.             sortable: false,
  97.             field: {
  98.                 xtype: 'combobox',
  99.                 id:'authors',
  100.                 typeAhead: true,
  101.                 triggerAction: 'all',
  102.                 queryMode: 'local'
  103.                 selectOnTab: true,
  104.                 store: cbstore,
  105.                 lazyRender: true,
  106.                 displayField:'name',
  107.                 valueField:'id',
  108.                 listClass: 'x-combo-list-small',
  109.                 listeners:{    
  110.                     select : function(combo, record,index){
  111.                         isEdit = true;
  112.                     }
  113.                 }
  114.                  
  115.             },
  116.             renderer:rendererData
  117.         },{
  118.             header: "点击数"
  119.             width: 80, 
  120.             dataIndex: 'hits'
  121.             sortable: true,
  122.             field: {
  123.                 xtype: 'numberfield',
  124.                 allowBlank: false,
  125.                 minValue: 0,
  126.                 maxValue: 100000
  127.             }
  128.         },{
  129.             header: "添加时间"
  130.             width: 100, 
  131.             dataIndex: 'addtime'
  132.             sortable: true,
  133.             renderer: formatDate,
  134.             field: {
  135.                 xtype: 'datefield',
  136.                 format: 'y-m-d',
  137.                 minValue: '01/01/06'
  138.             }
  139.         },{
  140.             xtype: 'checkcolumn',
  141.             header:'审核',
  142.             dataIndex:'checked',
  143.             width:55
  144.         }],
  145.         height:400,
  146.         width:520,
  147.         x:20,
  148.         y:40,
  149.         title: 'ExtJS4 EditGrid(可编辑的Grid)',
  150.         
  151.         disableSelection: false,//值为TRUE,表示禁止选择
  152.         frame: true,
  153.         selType: 'cellmodel',
  154.         loadMask: true,
  155.         renderTo: 'demo',
  156.         viewConfig: {
  157.             id: 'gv',
  158.             trackOver: false,
  159.             stripeRows: false
  160.         },
  161.         dockedItems: [{
  162.             dock: 'top',
  163.             xtype: 'toolbar',
  164.             items: [{
  165.                 itemId: 'Button',
  166.                 text:'显示所选',
  167.                 tooltip:'Add a new row',
  168.                 iconCls:'add',
  169.                 handler:function(){
  170.                     var record = grid.getSelectionModel().getSelection();
  171.                     if(record.length == 0){
  172.                         Ext.MessageBox.show({
  173.                             title:"提示",
  174.                             msg:"请先选择您要操作的行!",
  175.                             icon: Ext.MessageBox.INFO,
  176.                             buttons: Ext.Msg.OK
  177.                         })
  178.                         return;
  179.                     }else{
  180.                         var ids = "";
  181.                         for(var i = 0; i < record.length; i++){
  182.                             ids += record[i].get("id")
  183.                             if(i<record.length-1){
  184.                                 ids = ids + ",";
  185.                             }
  186.                         }
  187.                         Ext.MessageBox.show({
  188.                             title:"所选ID列表",
  189.                             msg:ids
  190.                             //icon: Ext.MessageBox.INFO
  191.                         })
  192.                     }
  193.                 }
  194.             },'-',{
  195.                 width: 300,
  196.                 fieldLabel: '搜索',
  197.                 labelWidth: 50,
  198.                 xtype: 'searchfield',
  199.                 store: store
  200.             }]
  201.         }, {
  202.             dock: 'bottom',
  203.             xtype: 'pagingtoolbar',
  204.             store: store,
  205.             pageSize: 25,
  206.             displayInfo: true,
  207.             displayMsg: '显示 {0} - {1} 条,共计 {2} 条',
  208.             emptyMsg: '没有数据'
  209.         }],
  210.         plugins: [cellEditing]
  211.         
  212.     })
  213.     store.loadPage(1);
  214.     grid.on('edit', onEdit, this);
  215.     
  216.     function onEdit(){
  217.         var record = grid.getSelectionModel().getSelection()[0];
  218.         //这里进行异步操作,关于Extjs的异步操作这里不做演示,仅列出所有值。
  219.         var title   = record.get('title');
  220.         var author  = record.get('author');//注意,这里得到的是id值,而不是name值,如果没有修改作者,那么得到的值是默认显示的字符串,这个需要在服务端进行判断并处理。
  221.         var clk     = record.get('hits');
  222.         var addtime = Ext.Date.dateFormat(record.get('addtime'), 'Y-m-d');
  223.         var checked = record.get('checked');
  224.         Ext.MessageBox.show({
  225.             title:"修改的数据为",
  226.             msg:title+"\r\n"+author+"\r\n"+clk+"\r\n"+addtime+"\r\n"+checked,
  227.             icon: Ext.MessageBox.INFO,
  228.             buttons: Ext.Msg.OK
  229.         })
  230.     }
  231.     
  232.     function rendererData(value,metadata,record){
  233.         if(isEdit){
  234.             var index = cbstore.find(Ext.getCmp('authors').valueField,value);
  235.             var record = cbstore.getAt(index);
  236.             return record.data.name;
  237.         }else{
  238.             return value;
  239.         }
  240.         
  241.     }
  242. })
 

editgrid.asp:时间关系,只简单做了些测试数据。

 
  1. <%
  2.     Response.ContentType = "text/html"
  3.     Response.Charset = "UTF-8"
  4. %>
  5. <%
  6. '返回JSON数据,自定义一些测试数据。。
  7. '这里的参数与EXT3.x相同,区别在于排序字段和排序方式使用了新的属性。
  8. '由于这里是测试数据,接收的参数只用到了start,limit。sorts和dir在实际操作过程中,将之加入SQL的ORDER BY里即可。
  9. start = Request("start")
  10. limit = Request("limit")
  11. '查询时获取的参数。
  12. query = Request("query")
  13. If start = "" Then
  14.     start = 0
  15. End If
  16. If limit = "" Then
  17.     limit = 50
  18. End If
  19. sorts = Replace(Trim(Request.Form("sort")),"'",""
  20. dir = Replace(Trim(Request.Form("dir")),"'","")
  21. '测试数据,这里直接输出结果,实际应用中,应该把查询条件放到SQL语句中。
  22. If query = "newstitle" Then
  23.     Echo("{")
  24.     Echo("""total"":")
  25.     Echo("""1")
  26.     Echo(""",""items"":[")
  27.     Echo("{")
  28.     Echo("""title"":""newstitle""")
  29.     Echo(",")
  30.     Echo("""author"":""author""")
  31.     Echo(",")
  32.     Echo("""hits"":""100""")
  33.     Echo(",")
  34.     Echo("""addtime"":"""&Now()&"""")
  35.     Echo("}")
  36.     Echo("]}")
  37. Else
  38. Dim counts:counts=20
  39. '注意,这里的counts相当于Rs.RecordCount,也就是记录总数。
  40. Dim Ls:Ls = Cint(start) + Cint(limit)
  41. If Ls >= counts Then
  42.    Ls = counts
  43. End If
  44. Echo("{")
  45. Echo("""total"":")
  46. Echo(""""&counts&""",")
  47. Echo("""items"":[")
  48. For i = start+1 To Ls
  49.    Echo("{")
  50.    Echo("""id"":"""&i&"""")
  51.    Echo(",")
  52.    Echo("""title"":""newstitle"&i&"""")
  53.    Echo(",")
  54.    Echo("""author"":""author"&i&"""")
  55.    Echo(",")
  56.    Echo("""hits"":"""&i&"""")
  57.    Echo(",")
  58.    Echo("""addtime"":"""&Now()&"""")
  59.    Echo(",")
  60.    If i Mod 4 = 0 Then
  61.       Echo("""checked"":""true""")
  62.    Else
  63.       Echo("""checked"":""false""")
  64.    End If
  65.    Echo("}")
  66.    If i<Ls Then
  67.       Echo(",")
  68.    End If
  69. Next
  70. Echo("]}")
  71. End If
  72. Function Echo(str)
  73.    Response.Write(str)
  74. End Function
  75. %>

 

由于4.x有了重大更新,所以很多在3.x中的东西在4.x里并不好使,直接导致了本文迟迟没有发表,原因就出在了更新下拉框后,Grid中显示的是ID号而不是name值。一番查看API及研究,终于发现问题所在,3.x中renderer combobox在4.x并不好用,最后重新读了一遍自己写的代码,才有所顿悟。希望文章能起到一个抛砖引玉的作用,大家一起进步。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值