ExtJS4.1 分组+行编辑做增删查改例子

<%@ page language="java" pageEncoding="UTF-8"%>  
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
    <title>举个栗子</title>  
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">       
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
    
       
	<link rel="stylesheet" href="extjs/resources/css/ext-all.css" type="text/css"></link>
  	<link rel="stylesheet" href="extjs/examples/shared/example.css" type="text/css"></link>
  	
	<script type="text/javascript" src="extjs/ext-all.js"></script>
	<script type="text/javascript" src="extjs/examples/shared/examples.js"></script>
    <script type="text/javascript" src="extjs/locale/ext-lang-zh_CN.js"></script>
    <script type="text/javascript">  
    Ext.onReady(function(){    
    	Ext.define("Everts",{
	    	extend:"Ext.data.Model",  
            fields:[  
                 {name:"id"},  
                 {name:"calendar"},   
                 {name:"title"},   
                 {name:"start", type:"date", dateFormat:"Y-m-dTH:i:s"}  ,   
                 {name:"end", type:"date", dateFormat:"Y-m-dTH:i:s"}  ,   
                 {name:"loc"},   
                 {name:"notes"},   
                 {name:"url"},   
                 {name:"ad", type: 'bool'},
                 {name:"rem"},     
                 {name:"n", type: 'bool'} 
            ]  
		}); 
		
		Ext.define("Calendar",{
	    	extend:"Ext.data.Model",  
            fields:[  
                 {name:"id"},  
                 {name:"title"}
            ]  
		});  
	    
	    Ext.create('Ext.data.Store', {
	    	model : 'Everts',
	    	storeId:'evertsStore',
		    fields: ['id', 'calendar','title', 'start','end', 'loc','notes', 'url','ad', 'rem', 'n'],
		    proxy: {
		        type: 'ajax',
		        url: 'findEverts.action',
		        reader: {
		            type: 'json',
		            root: 'everts'
		        }
		    },
		    //用时间分组要format
		    getGroupString: function(instance) {  
	            var group = this.groupers.first();  
	            if (group) {  
	                if (group.property === 'start') {  
	                    return Ext.Date.format(new Date(instance.get('start')), 'Y-m-d');  
	                }  
	                return instance.get(group.property);  
	            }  
	            return '';  
	        },  
		    sorters: {property: 'title', direction: 'ASC'},
        	groupField: 'start',//分组字段
	    	autoLoad: true
		});
	    
	    Ext.create('Ext.data.Store', {
			model : 'Calendar',
			storeId:'calendarsStore',
		    proxy: {
		        type: 'ajax',
		        url: 'findCalendars.action',
		        reader: {
		            type: 'json',
		            root: 'calendars'
		        }
		    },
		    autoLoad: true
		});
		//行编辑
	    var rowEditing= Ext.create('Ext.grid.plugin.RowEditing', {
	        clicksToMoveEditor: 1,
	        autoCancel: false
	    });
	    
		var grid = Ext.create('Ext.grid.Panel', {
		    title: 'Simpsons',
		    layout:'fit',
		    store: Ext.data.StoreManager.lookup('evertsStore'),
		    selModel : Ext.create('Ext.selection.CheckboxModel', {}),
		    columns: [
		        { header: 'id',  dataIndex: 'id', hidden: true},
		        { 
		        	header: 'calendar', 
		        	dataIndex: 'calendar',
		        	renderer: function(value){
		        		if(value != null){
		        			return value.title;
		        		}
		        	},
		        	width: 120,
		        	editor: {
		                xtype: 'combo',
		                id: 'aaa',
		                queryMode: 'local',
		                store: Ext.data.StoreManager.lookup('calendarsStore'),
					    displayField: 'title',
					    valueField: 'id',
                		triggerAction: 'all',
                		editable: false,
		                allowBlank: false
		            },
		            summaryType: 'count',
		            summaryRenderer: function(value, summaryData, dataIndex) {
		                return value + ' 项';
		            }
		        },
		        { 
		        	header: 'title', dataIndex: 'title', 
		        	editor: {
		        		xtype: 'textfield'
		        	},
		            flex: 1
		        },
		        { 
		        	xtype:'datecolumn' ,header: 'end', dataIndex: 'end', format: 'Y-m-d',
		        	editor: {
		                xtype: 'datefield',
		                allowBlank: false,
		                format: 'Y-m-d'
		            }
	            },
		        { header: 'loc',dataIndex: 'loc', 
		        	editor: {
		        		xtype: 'textfield'
		        	}
		        },
		        { header: 'notes', dataIndex: 'notes', editor: {
		        		xtype: 'textfield'
		        	}
		        },
		        { header: 'url', dataIndex: 'url', editor: {
		        		xtype: 'textfield'
		        	}
		        },
		        { 
		        	header: 'ad', 
		        	dataIndex: 'ad',
		        	renderer: function(value){
				        if (value) {
				            return '√';
				        }else{
				        	return '×';
				        }
				    },
		        	editor: {
	                	xtype: 'checkbox',
		                cls: 'x-grid-checkheader-editor'
		            }
		     	},
		        //{ header: 'rem', dataIndex: 'rem' },
		        { 
		        	header: 'n', 
		        	dataIndex: 'n',
		        	renderer: function(value){
				        if (value) {
				            return '√';
				        }else{
				        	return '×';
				        }
				    },
		        	editor: {
	                	xtype: 'checkbox',
		                cls: 'x-grid-checkheader-editor'
		            }
	    		}
		        
		    ],
		    tbar: [{
		    	xtype: 'combo',
                queryMode: 'local',
                store: Ext.data.StoreManager.lookup('calendarsStore'),
			    displayField: 'title',
			    valueField: 'id',
              	triggerAction: 'all',
              	editable: false
		    },{
	            text: '新增',
	            iconCls: 'employee-add',
	            handler : function() {
	                rowEditing.cancelEdit();
	                // 创建新对象
	                var r = Ext.create('Everts', {
	                //'id', 'calendar','title', 'start','end', 'loc','notes', 'url','ad', 'rem', 'n'
	                	calendar: Ext.data.StoreManager.lookup('calendarsStore').getAt(0),
	                    title: 'new',
	                    start: new Date(),
	                    end: new Date()
	                });
					//插入新对象
	                Ext.data.StoreManager.lookup('evertsStore').insert(0, r);
	                rowEditing.startEdit(0, 0);
	            }
	        }, {
	            itemId: 'removeEmployee',
	            text: '删除',
	            iconCls: 'employee-remove',
	            handler: function() {
	                var records = grid.getSelectionModel().getSelection();
	                if(records.length != 1){
	                	Ext.example.msg('提示', '请选择一条记录!');
	                	return;
	                }
	            	var params = {
						'id': records[0].data.id
					}; 
					var url = "deleteEvert.action";
					var succFn = function(){
						e.record.commit();
						Ext.data.StoreManager.lookup('evertsStore').load();
					};
					var failMsg = "删除";
	            	//新版消息框的好处,能直接用方法
	            	Ext.MessageBox.show({
			           	title:'提示',
			           	msg: '确定要删除该数据吗?',
			           	buttons: Ext.MessageBox.YESNO,
			           	fn: actionFn(params,url,succFn,msg),
           				icon: Ext.MessageBox.QUESTION
           			});
	            },
	            disabled: true
	        }],
	        features: [{
	            id: 'group',
	            ftype: 'groupingsummary',
	            groupHeaderTpl: '{name}',
	            hideGroupedHeader: true,
	            enableGroupingMenu: false
	        }],
	        plugins: [rowEditing] ,
	        listeners: {
	            'selectionchange': function(view, records) {
	                grid.down('#removeEmployee').setDisabled(!records.length);
	            }
	        },
		    renderTo: 'editor-grid'
		});
		
		//监听编辑按钮
		grid.on('edit', function(editor, e) {
			var params = {
				'evert.id': e.record.data.id,
				'evert.calendar.id': e.record.data.calendar,
				'evert.title':  e.record.data.title,
				'evert.start': e.record.data.start,
				'evert.end' : e.record.data.end,
				'evert.loc' : e.record.data.loc,
				'evert.notes' : e.record.data.notes,
				'evert.url' : e.record.data.url,
				'evert.ad' : e.record.data.ad,
				//'evert.rem' : e.record.data.rem,
				'evert.n' : e.record.data.n
			}; 
			var url = "saveEvert.action";
			var succFn = function(){
				e.record.commit();
				Ext.data.StoreManager.lookup('evertsStore').load();
			};
			var failMsg = "新增";
			
			actionFn(params,url,succFn,failMsg);
		});
        
        /**	
        	统一提交action方法;
	        params: 参数,
	        url: 地址,
	        succFn: 成功后执行的方法,
	        failMsg: 失败提示.
        */
        function actionFn(params,url,succFn,failMsg){
        	Ext.Ajax.request({
          		params: params,
				url: url,
				success: function(response) {
					var resp = Ext.JSON.decode(response.responseText);
					if (resp.status == "ok") {
		           		succFn();
					} else {
						Ext.MessageBox.alert(msg+'失败', resp.status);
					}
				}
			});
        }
		
		/**
			解决在rowEditing中使用对象下拉框时加载为[object Object]的现象		
		*/
		Ext.override(Ext.form.field.ComboBox, {
		    findRecord: function(field, value) {
		        var ds = this.store,
		            idx = ds.findExact(field, value[field]);
		        return idx !== -1 ? ds.getAt(idx) : false;
		    }
		});
				
		
  	});
    </script>
    <style type="text/css">
        .employee-add {
            background-image: url('extjs/examples/shared/icons/fam/user_add.gif') !important;
        }

        .employee-remove {
            background-image: url('extjs/examples/shared/icons/fam/user_delete.gif') !important;
        }
        .task .x-grid-cell-inner {
            padding-left: 15px;
        }
        .x-grid-row-summary {
            color:#333;
            background: #f1f2f4;
        }
        .x-grid-row-summary  .x-grid-cell-inner {
            font-weight: bold;
            font-size: 11px;
            padding-bottom: 4px;
        }
        .x-grid-hide-summary .x-grid-row-summary {
            display:none;
        }
        .x-grid-row .x-grid-cell-cost {
            background-color:#f1f2f4;
        }
        .x-grid-row-summary .x-grid-cell-cost {
            background-color:#e1e2e4;
        }
    </style>
</head>  
     
  <body>
      <div id="editor-grid"></div>
  </body>
</html>  

例子代码如上,后台代码自己写,数据能接受到,就不管用什么方式提交到数据库了.

上图:




发布了52 篇原创文章 · 获赞 12 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/caodegao/article/details/7732499