Extjs学习总结之22GridPanel扩展

首先,21我没写,因为21是关于分页的,分页我们之前已经讲过了,并且在20章的行模型中也有样式,所以就没写。

 

下面我们讲的是22 表格面板的扩展,所谓扩展就是其他额外的功能,比如添加新行拉,展开了一类的。

 

gridpanel.js

Ext.onReady(function(){
	/*
	 * 行选择模型Ext.grid.RowSelectionModel与数据无关,所以我们不能试图通过Ext.grid.RowSelectionModel
	 * 去读取单元格的数据,RowSelectionModel为我们定义的主要是两个方面的东西,一是提供大量的方法
	 * 用于选择行,如选择上一行,选择下一行,选择所有行等等,而是获取行的选择信息,如某一行是否被选中,
	 * 选中的行数等等。
	 */
	
	/*
	 * Ext.grid.GridPanel其实就是一个panel,Ext.panel是它的父类,
	 * 在面板上放置表格数据就成了GridPanel.
	 * 
	 * 从外观上看,表格分为:表头,数据行,分页栏。分页这里不去考虑。主要看表头和数据行。
	 * 表头为表格列提供一系列的信息,包含了列的说明,列的宽度,是否可以改变大小值,
	 * 是否可以排序,是否出现菜单等数据。表头由列模型Ext.grid.ColumnModel定义,
	 * 是Ext.util.Observable的子类,所以列模型也会出发相应的事件,列模型通常会
	 * 包含若干个列的信息,每一列的信息保存在JSON结构中,一个列的配置选项有很多。
	 */
	
	/*加强版的列模型*/
	 
	 
	//定义列模型 dataIndex表示记录结构中name的属性值
//	var cm = new Ext.grid.ColumnModel([
//		{header:"姓名",width:80,dataIndex:"Name",tooltip:"这是您的姓名"},
//		{header:"性别",width:40,dataIndex:"Sex",align:"center"},
//		{header:"生日",width:150,format:"Y-m-d",dataIndex:"Birthday"},
//		{header:"学历",width:80,dataIndex:"Education",align:"center"},
//		{id:"memo",header:"备注",dataIndex:"Memo"}
//	]);
//	
	
	//创建复选框对象
	var sm = new Ext.grid.CheckboxSelectionModel();
//	var expander = new Ext.grid.RowExpander({
//		tpl:new Ext.Template("<p><span>备注</span></p>")
//	});
	
	
	/***************加强版的列模型********************/
	var cm = new Ext.grid.ColumnModel([
//		expander,
		new Ext.grid.RowNumberer(),
		sm, //添加复选框
//		{header:"ID",width:50,dataIndex:"Hid",tooltip:"这是您的编号"},
		{header:"姓名",width:100,dataIndex:"Name",tooltip:"这是您的姓名"},
		{header:"性别",width:50,dataIndex:"Sex",align:"center",
			renderer:function(v){
				if(v == "男"){
					return "♂";
				}else{
					return "♀";
				}
			}
		},
			
		{header:"生日",width:120,format:"Y-m-d",dataIndex:"Birthday",
			renderer:Ext.util.Format.dateRenderer("Y-m-d")},
		{header:"学历",width:100,dataIndex:"Education",align:"center"},
		{id:"memo",header:"备注",dataIndex:"Memo"},
		{header:"操作",width:150,dataIndex:'',menuDisabled:true,
			renderer:function(v){
				return "<span style='margin-right:10px'><a href='#'>修改</a></span><span><a href='#'>删除</a></span>"
			}
		}
	]);
//	new Ext.grid.RowNumberer.prototype={
//		header:"",
//		width:23,
//		sortable:false,
//		fixed:true,
//		menuDisabled:true,
//		dataIndex:'',
//		id:'numberer',
//		rowspan:undefined,
//		renderer:function(v,p,record,rowIndex){
//			if(this.rowspan){
//				p.cellAttr = 'rowspan ="'+his.rowspan+"" ;
//			}
//			return rowIndex+1;
//		}
//	};
	/**********************************************/
	
	
	
	
	
	//创建DataProxy,DataReader和Store对 store对象和GridPanel绑定 GrilPanel就能显示数据
	var data = [
		{name:"吕鹏",sex:"男",birthday:Date.parseDate("1990-03-10","Y-m-d"),edu:"本科",memo:"无备注"},
		{name:"代红",sex:"女",birthday:Date.parseDate("1990-03-10","Y-m-d"),edu:"专科",memo:"无备注"},
		{name:"涛涛",sex:"男",birthday:Date.parseDate("1990-03-10","Y-m-d"),edu:"专科",memo:"无备注"},
		{name:"振振",sex:"女",birthday:Date.parseDate("1990-03-10","Y-m-d"),edu:"专科",memo:"无备注"}
	];
	//Proxy
	var proxy = new Ext.data.MemoryProxy(data);
	
	//Record 定义记录的结果
	var Human = Ext.data.Record.create([
//		{name:"Hid",type:"int",mapping:"hid"},
		{name:"Name",type:"string",mapping:"name"},
		{name:"Sex",type:"string",mapping:"sex"},
		{name:"Birthday",type:"string",mapping:"birthday"},
		{name:"Education",type:"string",mapping:"edu"},
		{name:"Memo",type:"string",mapping:"memo"}
	]);
	
	//Reader
	var reader = new Ext.data.JsonReader({},Human);
	//Store  列模型中的dataIndex必须和Human结构中的name属性保持一致
	var store = new Ext.data.Store({
		proxy:proxy,
		reader:reader
	});
	store.load();
	
	
	//现在,列模型和数据都准备好了,将这些数据作为GridPanel的选项配置传递到
	//GridPanel的构造方法中,并适当的设置外观参数,效果就出来了。、
	var grid = new Ext.grid.GridPanel({
		title:"中国四有青年模范代表",
		width:900,
		autoHeight:true,
		cm:cm,
		sm:sm,
		store:store,
		renderTo:"a",
//		plugins:[expander],
		antuExpandColumn:"edu", //自由伸缩 占满剩余区域
		//带摘要的GridPanel
		viewConfig:{
			forceFit:true,
			enableRowBody:true,
			showPreview:true,
			showPreview:true,
			getRowClass:function(record,rowIndex,p,store){
				if(this.showPreview){
					p.body = '<p>备注,我们一定要团结一致</p>';
					return 'x-grid3-row-expanded';
				}
				return 'x-grid3-row-collapsed';
			}
			
		},
		//分页工具栏
		bbar:
			new Ext.PagingToolbar({
			store:store,
			pageSize:6,
			displayInfo:true,
			diaplayMsg:"本页显示第{0}条到第{1}的数据,一共两条",
			emptyMsg:"没有记录",
			items:["-",{
				cls:"x-btn-text-icon",
				pressed:true,
				enableToggle:true,
				text:'隐藏备注',
				cls:'x-btn-text-icon details',
				toggleHandler:function(btn,pressed){
					var view = grid.getView();
					if(pressed){
						btn.setText("隐藏备注");
					}else{
						btn.setText("显示备注");
					}
					view.showPreview = pressed;
					view.refresh();
				}
			}]
		}),
		
		buttonAlign:"center",
		buttons:[{
			text:"第一行",
			handler:function(){
				var rsm = grid.getSelectionModel();//得到行选择模型
				rsm.selectFirstRow();
			}
		},{
			text:"上一行",
			handler:function(){
				var rsm = grid.getSelectionModel();
				if(!rsm.hasPrevious()){
					Ext.Msg.alert("警告","已经达第一行");
				}else{
					rsm.selectPrevious();
				}
			}
		},{
			text:"下一行",
			handler:function(){
				var rsm = grid.getSelectionModel();
				if(!rsm.hasNext()){
					Ext.Msg.alert("警告","已经到达最后一行");
				}else{
					rsm.selectNext();
				}
			}
		},{
			text:"最后一行",
			handler:function(){
				var rsm = grid.getSelectionModel();
				rsm.selectLastRow();
			}
		},{
			text:"全选",
			handler:function(){
				var rsm = grid.getSelectionModel();
				rsm.selectAll();
			}
		},{
			text:"全不选",
			handler:function(){
				var rsm = grid.getSelectionModel();
				rsm.deselectRange(0,grid.getView().getRows().length-1);
			}
		},{
			text:"反选",
			handler:function(){
				var rsm = grid.getSelectionModel();
				//获得总行数grid.getView.getRows().length
				for(var i=grid.getView.getRows().length-1;i>=0;i--){
					if(rsm.isSelected(i)){
						rsm.deselectRow(i);
					}else{
						rsm.selectRow(i,true);
					}
				}
			}
		},{
			/*
			 * Grid视图被定义为Ext.grid.GridView类,可以根据用户提供的参数渲染表格,得到原始的行与列的信息。
			 * 
			 * Store由结构和数据构成,每一行都是一个Ext.data.Record.Record都有name标识
			 * grid.getStore()方法可以获得GridPanel的Store,getAt(i)取得第i个Record
			 * get(Memo)是获得Record的Memo的值;
			 * 
			 */
			text:"测试",
			handler:function(){
				var view = grid.getView();
				var rsm = grid.getSelectionModel();//得到行选择模型
				var r = "";
				for(var i=0;i<view.getRows().length;i++){
					if(rsm.isSelected(i)){
						r += grid.getStore().getAt(i).get("Name")+"<br>";
					}
				}
				Ext.Msg.alert("选择","您选择的数据有: <br>"+r);
			}
			
		},{
			text:"增加新人物",
			handler:function(){
				var view = grid.getView();
				//创建一个JSON对象备用:当添加新行的时候将这个人的信息添加到表格上
				var obj = {
							Name:"新人物",
							Sex:"女",
							Birthday:Date.parseDate("1990-03-10","Y-m-d"),
							Education:"本科",
							Memo:"无备注"
						};
				//将obj与Human合并
				var human = new Human(obj);
				grid.getStore().insert(0,human);//添加到行首
//				grid.getStore().add(human);//添加到行尾
				view.refresh();
			}
			
		},{
			/*
			 * 删除选择行:
			 * <1> 循环遍历所有行
			 * <2> 判断当前行是否被选中
			 * <3> 删除选中的行
			 */
			text:"删除选择行",
			handler:function(){
				var rsm = grid.getSelectionModel();
				var view = grid.getView();
				var store = grid.getStore();
				for(var i=view.getRows().length-1;i>=0;i--){
					if(rsm.isSelected(i)){
						store.remove(store.getAt(i));
					}
				}
				view.refresh();
			}
		},{
			//删除所有行
			text:"删除所有行",
			handler:function(){
				var store = grid.getStore();
				var view = grid.getView();
				store.removeAll();
				view.refresh();
			}
		}]
	});
	
	/**
	 * 小结:
	 * 至此,我们已经学习了三个非常重要的类,Ext.grid.ColumnModel,
	 * Ext.grid.RowSelectionModel,Ext.grid.GridView,这三个类分工明确,
	 * 职责清晰,在我们设计的时候是很好的借鉴和典范。
	 * 
	 * Ext.grid.ColumnModel定义表头,包含了列的所有信息,并提供丰富的高级功能,
	 * ,如排序菜单列是否被隐藏等,默认情况下, 排序被禁用,需要将sort设置为true。
	 * 
	 * Ext.grid.RowSelectionModel负责行的选择通过他我们可以实现任何的选择操作。
	 * 
	 * Ext.grid.GridView完成表格的渲染,通过他我们可以获取表格行列的原始数据。
	 * 
	 * 另外,Ext.data.Store也功不可没,数据操作最终还是通过他来实现,该类负责更新
	 * 数据,GridView负责显示数据,RowSelectionModel负责选择数据。
	 * 
	 */
});


 

效果图:

 

注: 可能效果图和代码有些不一样,因为后面有过扩张的功能我没做出来,只完成了备注。正在修改中。。。呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值