ExtJS实现完美Grid(1)
这篇文章要实现一个简单的grid,主要功能包括展示、分页、添加、修改、删除、单选、复选和功能列等。 1、首先我们要在页面嵌入一个div标签和引入我们的grid.js文件如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>grid.htm</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> <link rel="stylesheet" type="text/css" href="../ext/resources/css/ext-all.css" /> <link rel="stylesheet" type="text/css" href="../css/ext-patch.css" /> <script type="text/javascript" src="../ext/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="../ext/ext-all.js"></script> <script type="text/javascript" src="../ext/build/locale/ext-lang-zh_CN.js"></script> <script type="text/javascript" src="../js/grid.js" defer="defer"></script> </head> <body style="margin: 0;overflow:hidden"> <div id="grid" style="width:100%;height:100%"></div> </body> </html> 2、然后写js,首先初始化提示信息,在grid.js最上边加上 Ext.QuickTips.init();// 浮动信息提示 3、定义后台服务地址和分页变量 //定义分面参数 var gridUrl='../server/gridserver.jsp'; //取数据的服务页 var start=0;//读取的起始行 var limit=10;//每次读取的行数 4、在onReady事件中加入我们的功能实现,首先定义一个数据对象,相当于C++中的结构体,如下 //定义数据对象 var Person=Ext.data.Record.create([ {name:'name',type:'string'}, {name:'sex',type:'string'}, {name:'birthday',type:'date',dateFormat:'Y-m-d'}, {name:'office',type:'string'}, {name:'salary',type:'string'}, {name:'tel',type:'string'}, {name:'QQ',type:'string'}, {name:'email',type:'string'}, {name:'address',type:'string'}, {name:'action',type:'string'} ]); 注意type不要写错 5、定义列的选择属性,再定义一个控制选择模式的按扭 var sm = new Ext.grid.CheckboxSelectionModel({singleSelect:true});//可设置选择模式 //控制单选或复选 var DSButton=new Ext.Toolbar.Button({ text:'可复选' }) 6、定义列、列的格式化显示及设置编辑时的控件,包括文本、下拉框、时间选择框,数字控制等 // 下拉框组件 var sexdata=[['0','男'],['1','女']]; var sexSelect=new Ext.form.ComboBox({ store:new Ext.data.SimpleStore({ fields:['value','text'], data:sexdata }), emptyText:'请选择', mode:'local', triggerAction:'all', valueFiled:'value', displayField:'text', readyOnly:true }); //定义列 var cm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), sm, { header : '姓名', align:'center', dataIndex : 'name', width : 80, editor:new Ext.grid.GridEditor(new Ext.form.TextField({ allowBlank:false, emptyText:'不能为空!', regex:/^[\u4E00-\u9FA5]+$/, //正则表达式验证,只能输入汉字 regexText:'请输入汉字!', bodyStyle:'height:100%' })) }, { header : '性别', align:'center', dataIndex : 'sex', width : 50, editor:new Ext.grid.GridEditor(sexSelect) }, { header : '出生日期', align:'center', dataIndex : 'birthday', width : 100, editor:new Ext.grid.GridEditor(new Ext.form.DateField({ format:'Y-m-d' } )), renderer:function(value){ return Ext.util.Format.date(value,'Y-m-d'); } }, { header : '职位', align:'center', dataIndex : 'office', width : 100, editor:new Ext.grid.GridEditor(new Ext.form.TextField({ allowBlank:false, emptyText:'不能为空!' })) }, { header : '薪水', align:'center', dataIndex : 'salary', width : 80, renderer:changeTwoDecimal, editor:new Ext.grid.GridEditor(new Ext.form.NumberField({ allowBlank:false, emptyText:'不能为空!', decimalPrecision:2 //设置小数位的精度 })) }, { header : '电话', align:'center', dataIndex : 'tel', width : 100 }, { header : 'QQ', align:'center', dataIndex : 'QQ', width : 100 }, { header : '邮箱', align:'center', dataIndex : 'email', width : 150 }, { header : '地址', align:'center', dataIndex : 'address', width : 150 },{ id:'action', header : '操作', align:'center', dataIndex : 'action' } ]); //显示两位小数 function changeTwoDecimal(x) { x=Number(x); return x.toFixed(2); } //默认排序 cm.defaultSortable = true; 7、写义record对象的存储容器store // 表格数据 var store = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ url:gridUrl, method:'post' }), reader:new Ext.data.JsonReader({ root:'root',totalProperty:'totalCount' //指定分页控件属性用 },Person) }); 8、创建gridPanel对象,我觉得叫组装更合适一些,因为前边我们都把一些“零部件”都造好了 // 表格组装 var grid = new Ext.grid.EditorGridPanel({ el : 'grid', store : store, cm : cm, sm : sm, region:'center', bodyStyle:'width:100%;height:100%', autoScroll:true, autoExpandColumn:'action', tbar : [{ pressed : true, text : '添加', handler : function() { var p=new Person({ name:'', sex:'', office:'', birthday:'', salary:'', action:'<a href="#">操作</a>' }); grid.stopEditing(); store.insert(0,p); grid.startEditing(0,2); } }, { xtype:'tbseparator' },{ pressed : true, text : '删除', handler : function() { var sels=grid.getSelectionModel().getSelections(); for(var i=0;i<sels.length;i++){ var record=sels[i]; store.remove(record); } } },{ xtype:'tbseparator' },DSButton ], bbar:new Ext.PagingToolbar({ pageSize : limit, store : store, displayInfo : true, displayMsg : '显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg : "没有记录" }) }); grid.render(); //渲染 9、加单选和复选控制 DSButton.on('click', function (e){ if(sm.singleSelect){ sm.singleSelect=false; DSButton.setText('可复选'); }else{ sm.singleSelect=true; DSButton.setText('可单选'); } if(sm.singleSelect) grid.getSelectionModel().selectRecords(grid.getSelectionModel().getSelections(),false); }); 10、加载数据 store.load({params:{start:start, limit:limit}}); 到此前台功能写好了 11、接下来写后台json数据,组织数据到list里面 //初始化示例数据 List list=new ArrayList(); list.add("{name:'李连杰',sex:'男',birthday:'1980-10-20',office:'总经理',salary:20000.342323,tel:'010888888',QQ:'666666666',email:'99999@yahoo.com',address:'中国',action:'<a href=\"http://www.baidu.com\" target=\"blank\">操作</a>'}"); …………………… 输入json数据 if(startStr!=null&&limitStr!=null){ int start=Integer.parseInt(startStr); int limit=Integer.parseInt(limitStr); //根据分页参数以JSON格式组织数据发送到客户端 StringBuffer gridData=new StringBuffer("{'totalCount':'"+list.size()+"','root':["); for(int i=start;i<(start+limit)&&i<list.size();i++){ gridData.append((String)list.get(i)+","); } gridData.deleteCharAt(gridData.length()-1);//去掉最后一个‘,’ gridData.append("]}"); out.println(gridData.toString()); out.flush(); }else{ //如果没有分页参数转过来把所有数据以JSON格式组织数据发送到客户端 StringBuffer gridData=new StringBuffer("{'totalCount':'"+list.size()+"','root':["); for(int i=0;i<list.size();i++){ gridData.append((String)list.get(i)+","); } gridData.deleteCharAt(gridData.length()-1);//去掉最后一个‘,’ gridData.append("]}"); out.println(gridData.toString()); } 这样后台就完成,发布一下,看看效果吧