Ext Js Grid 编辑 新增 删除 保存的一个小示例

<html> 

<head> 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

<title>Paging</title> 

 <link rel="stylesheet" type="text/css" href="css/ext-all.css" /> 

 <script type="text/javascript" src="ext-base.js"></script> 

 <script type="text/javascript" src="ext-all.js"></script> 

 <script type="text/javascript" src="edit-grid-paging.js"></script> 

 <link rel="stylesheet" type="text/css" href="grid-examples.css" /> 

 <link rel="stylesheet" type="text/css" href="examples.css" /> 

</head> 

<body> 

<script type="text/javascript" src="examples.js"></script> 

<div id="topic-grid"></div> 

</body> 

</html>


edit-grid-paging.js

Ext.onReady(function(){

Ext.QuickTips.init();
var authereditor = Editgridselect.init();//自定义下拉列表 数据取自数据库返回的Json

var Plant = Ext.data.Record.create([ 

 {name: 'title', type: 'string'}, 

 {name: 'forumtitle', type: 'string'}, 

 {name: 'forumid'}, 

 {name: 'author', type: 'string'}, 

 {name: 'replycount', type: 'int'}, 

 {name: 'lastpost', mapping: 'lastpost', type: 'date', dateFormat: 'timestamp'}, 

 {name: 'lastposter'}, 

 {name: 'excerpt'}, 

 {name: 'threadid'} 

 ]); 


 var store = new Ext.data.Store({ 

 proxy: new Ext.data.ScriptTagProxy({ //支持跨域获取数据 

 url: 'http://extjs.com/forum/topics-browse-remote.php' 

 }), 

 reader: new Ext.data.JsonReader({ 

 root: 'topics', 

 totalProperty:'totalCount', 

 id: "threadid" 


 }, Plant) 

 }) 


 store.setDefaultSort('lastpost', 'desc'); 



 // pluggable renders 

 /* 

 function renderTopic(value, p, record){ 

 return String.format( 

 '<b>{0}</b><a href="http://extjs.com/forum/forumdisplay.php?f={3}" target="_blank">{1} Forum</a>', 

 value, record.data.forumtitle, record.id, record.data.forumid); 

 } 

 */ 

 function renderTopic(value, p, record){ 

 return String.format( 

 '<b>{0}</b>', 

 value, record.data.forumtitle, record.id, record.data.forumid); 

 } 

 function renderLast(value, p, r){ 

 return String.format('{0} by {1}', value.dateFormat('M j, Y, g:i a'), r.data['lastposter']); 

 } 


 function examineflag(value){ 

 return value ? '是' : '否'; 

 }; 



 // 顶部工具栏按钮 

 var contrltar = [{ 

 text: '添加', 

 handler : function(){ 

 var p = new Plant({ 

 title: '', 

 forumtitle:'', 

 forumid:'', 

 author: '', 

 replycount: 0, 

 lastpost: (new Date()).clearTime(), 

 lastposter:'', 

 excerpt:'新内容' 

 }); 

 //var n = ds.totalLength; 

 grid.stopEditing(); 

 store.insert(0,p); //ds.insert(n, p); 

 grid.startEditing(0,1); //grid.startEditing(n, 0); 

 } 

 },{ 

 text: '删除', 

 handler : function(){ 

 var gcm = grid.getSelectionModel(); 

 var rows = gcm.getSelections(); 

 if(rows.length>0){ 

 for (var i = 0; i < rows.length; i++) { 

 var row = rows; 

 var data = row.data; 

 alert(row.data.threadid); 

 store.remove(row); 

 } 

 }else{ 

 Ext.Msg.alert('提示','请选择要删除的记录'); 

 } 



 } 

 }]; 

 //底部工具栏按钮 

 var pagingBar = new Ext.PagingToolbar({ 

 pageSize: 10, 

 store: store, 

 beforePageText:'当前页', 

 afterPageText:'共{0}页', 

 firstText:'首页', 

 lastText:'尾页', 

 nextText:'下一页', 

 prevText:'上一页', 

 refreshText:'刷新', 

 displayInfo: true, 

 displayMsg: '显示{0} - {1}条 共{2}条记录', 

 emptyMsg: "无记录显示", 


 items:[ 

 '-', { 

 pressed: true, 

 enableToggle:true, 

 text: '查看详情', 

 //cls: 'x-btn-text-icon details', 

 toggleHandler: function(btn, pressed){ 

 var view = grid.getView(); 

 view.showPreview = pressed; 

 view.refresh(); 

 } 

 }] 

 }); 


 var checkbox = new Ext.grid.CheckboxSelectionModel(); 


 var cm = new Ext.grid.ColumnModel([ 

 checkbox, 

 { 

 id: 'topic', // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 }) 

 header: "主题", 

 dataIndex: 'title', 

 width: 320, 

 renderer: renderTopic, 

 sortable: true, 

 editor: new Ext.form.TextArea({ 

 allowBlank: false, 

 blankText:'请输入主题' 

 }) 

 },{ 

 header: "作者", 

 dataIndex: 'author', 

 width: 100, 

 //hidden: true, 

 sortable: true, 

 editor: authereditor 


 },{ 

 header: "回复数", 

 dataIndex: 'replycount', 

 width: 70, 

 align: 'right', 

 sortable: true, 

 editor: new Ext.form.TextField({ 

 allowBlank: false 

 }) 

 },{ 

 id: 'last', 

 header: "最后发表", 

 dataIndex: 'lastpost', 

 width: 150, 

 renderer: renderLast, 

 sortable: true, 

 editor: new Ext.form.DateField({ 

 format: 'm/d/y', 

 minValue: '01/01/06', 

 disabledDays: [0, 6], 

 disabledDaysText: '周末不能选' 

 }) 

 },{ 

 header: "审核否", 

 dataIndex: 'indoor', 

 width: 55, 

 renderer: examineflag, 

 editor: new Ext.grid.GridEditor(new Ext.form.Checkbox()) 

 } 

 ]); 


 var grid = new Ext.grid.EditorGridPanel({ 

 store: store, 

 renderTo: 'topic-grid', 

 cm: cm, 

 width:980, 

 id:'egridpanel', 

 height:550, 

 title:'编辑表格', 

 autoExpandColumn:'common', 

 clicksToEdit:1,//设置点击几次才可编辑 

 frame:true, 

 sm:checkbox, 

 loadMask: true,//装载动画 

 stripeRows:false,//条纹 

 //autoHeight: true,//一定要写,否则显示的数据会少一行 

 //selModel: new Ext.grid.RowSelectionModel({singleSelect:true}),//设置单行选中模式, 否则将无法删除数据 



 // customize view config 

 viewConfig: { 

 forceFit:true, 

 enableRowBody:true, 

 //showPreview:true, 

 showPreview:true, 

 getRowClass : function(record, rowIndex, p, store){ 

 //if(this.showPreview){ 

 if(!this.showPreview){ 

 p.body = '<p>'+record.data.excerpt+'</p>'; 

 return 'x-grid3-row-expanded'; 

 } 

 return 'x-grid3-row-collapsed'; 

 } 

 }, 

 tbar: contrltar, 

 bbar: pagingBar 

 }); 


 grid.on("afteredit", afteredit, grid);//监听编辑后事件 

 store.load({params:{start:0, limit:10}}); 


 function afteredit(e){ 

 // e.column;//修改的列,数字类型 

 // e.row;//修改过的行从0开始 

 //e.originalValue;//原始值 

 //e.value;//新值 

 var data = e.record.data; 

 // 显示等待对话框 

 Ext.Msg.wait("请等候", "修改中", "操作进行中..."); 

 var id = data.threadid; //"threadid"为返回Json数据的字段名 


 Ext.Msg.alert('您成功修改了文章信息', "被修改的内容是:" + e.value + "\n 修改的字段是:" 

 + e.field+"; id是:"+id);// 取得用户名 

 } 


}); 




Ext.ux.SliderTip = Ext.extend(Ext.Tip, { 

 minWidth: 10, 

 offsets : [0, -10], 

 init : function(slider){ 

 slider.on('dragstart', this.onSlide, this); 

 slider.on('drag', this.onSlide, this); 

 slider.on('dragend', this.hide, this); 

 slider.on('destroy', this.destroy, this); 

 }, 


 onSlide : function(slider){ 

 this.show(); 

 this.body.update(this.getText(slider)); 

 this.doAutoWidth(); 

 this.el.alignTo(slider.thumb, 'b-t?', this.offsets); 

 }, 


 getText : function(slider){ 

 return slider.getValue(); 

 } 

}); 




Ext.grid.CheckColumn = function(config){ 

 Ext.apply(this, config); 

 if(!this.id){ 

 this.id = Ext.id(); 

 } 

 this.renderer = this.renderer.createDelegate(this); 

}; 


Ext.grid.CheckColumn.prototype ={ 

 init : function(grid){ 

 this.grid = grid; 

 this.grid.on('render', function(){ 

 var view = this.grid.getView(); 

 view.mainBody.on('mousedown', this.onMouseDown, this); 

 }, this); 

 }, 


 onMouseDown : function(e, t){ 

 if(t.className && t.className.indexOf('x-grid3-cc-'+this.id) != -1){ 

 e.stopEvent(); 

 var index = this.grid.getView().findRowIndex(t); 

 var record = this.grid.store.getAt(index); 

 record.set(this.dataIndex, !record.data[this.dataIndex]); 

 } 

 }, 


 renderer : function(v, p, record){ 

 p.css += ' x-grid3-check-col-td'; 

 return '<div class="x-grid3-check-col'+(v?'-on':'')+' x-grid3-cc-'+this.id+'"> </div>'; 

 } 

}; 





Ext.namespace('Editgridselect'); 

Editgridselect.init = function (){ 

 var fm = Ext.form, Ed = Ext.grid.GridEditor; 

 var RecordDef = Ext.data.Record.create([ 

 {name: 'formname'},{name: 'formid'} 

 ]); 

 var groupStore=new Ext.data.Store({ proxy: new Ext.data.HttpProxy({url: 'autherselect.php'}), 

 reader: new Ext.data.JsonReader({id:"sn",root:'datalist'},RecordDef ), 

 remoteSort: true }); 

 groupStore.load(); 

 var combox = new Ext.form.ComboBox({ 

 typeAhead: true,mode : 'local', selectOnFocus : true, 

 forceSelection : true ,triggerAction: 'all', 

 store:groupStore, hiddenName:'formname', 

 valueField : 'formid',displayField : 'formname', 

 lazyRender:true,listeners: { select: function() {this.setValue(combox.getRawValue()); } 

 } 

 }); 

 var editor = new Ed(combox); 

 return editor; 

}

服务器端:
autherselect.php

<?php 

header("Content-Type: text/plain; charset=utf-8"); 

$select = array('datalist'=>array( 

array('formname'=>'张三','formid'=>"SCZL"), 

array('formname'=>'李四','formid'=>"ZLBGV"), 

array('formname'=>'王五','formid'=>"fagg"), 

array('formname'=>'Dvaid','formid'=>"fhdf"), 

array('formname'=>'Rocky','formid'=>"rocky") 

) 

); 

echo json_encode($select); 

//echo "([{'formname':'Java','formid':'java'},{'formname':'EXTJS','formid': 'extjs'}])"; 

?>