zoukankan      html  css  js  c++  java
  • NW开发教程系列五:表头和表体(单表体)

    表头和表体页面包括两种,单子表和多子表,即1对1和1对多。这里先介绍单表体页面。这也是单据业务中经常遇到的一种页面。如图所示:

    省略前面的开发步骤。

    7、Service开发

    /**
     * 产品,表头和表体(单表体)
     * 
     * @author xuqc
     * @date 2013-10-17 下午02:44:40
     */
    @Service
    public class T210Service extends AbsBillServiceImpl {
    
    	public String getBillType() {
    		return "PROD";
    	}
    
    	private AggregatedValueObject billInfo;
    
    	public AggregatedValueObject getBillInfo() {
    		if(billInfo == null) {
    			billInfo = new ExAggProductVO();
    			VOTableVO vo = new VOTableVO();
    
    			// 由于是档案型,所以这里手工创建billInfo
    			vo.setAttributeValue(VOTableVO.BILLVO, ExAggProductVO.class.getName());
    			vo.setAttributeValue(VOTableVO.HEADITEMVO, ProductVO.class.getName());
    			vo.setAttributeValue(VOTableVO.PKFIELD, ProductVO.PK_PRODUCT);
    			billInfo.setParentVO(vo);
    
    			VOTableVO childVO = new VOTableVO();
    			childVO.setAttributeValue(VOTableVO.BILLVO, ExAggProductVO.class.getName());
    			childVO.setAttributeValue(VOTableVO.HEADITEMVO, ProductDetailVO.class.getName());
    			childVO.setAttributeValue(VOTableVO.PKFIELD, ProductVO.PK_PRODUCT);
    			childVO.setAttributeValue(VOTableVO.ITEMCODE, "demo_product_detail");
    			childVO.setAttributeValue(VOTableVO.VOTABLE, "demo_product_detail");
    
    			CircularlyAccessibleValueObject[] childrenVO = { childVO };
    			billInfo.setChildrenVO(childrenVO);
    		}
    		return billInfo;
    	}
    
    }
    

    8、Controller开发

     

    /**
     * 主子表,单子表
     * 
     * @author xuqc
     * @date 2013-10-17 下午02:55:09
     */
    @Controller
    @RequestMapping(value = "/busi/scene/t210")
    public class T210Controller extends AbsBillController {
    
    	@Autowired
    	private T210Service t210Service;
    
    	@Override
    	public T210Service getService() {
    		return t210Service;
    	}
    
    }
    

    9、jsp文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <%@ page language="java" pageEncoding="UTF-8"
    	contentType="text/html; charset=UTF-8"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <%@ include file="/common/header.jsp"%>
    <script>
    function yellowRenderer(value,meta,record){
    	meta.style+='background-color: #FFF000;';
    }
    function redRenderer(value,meta,record){
    	meta.style+='background-color: #EE0000;';
    }
    </script>
    </head>
    <body>
    <!-- 加入这个注释避免当body没有html内容时,在ie下出现空白行	-->
    <nw:Bill templetVO="${templetVO}" headerGridImmediatelyLoad="true" isBuildHeaderGrid="true"
    	bodyGridsPagination="true,false" bodyGridsBufferView="true,false" headerGridCheckboxSelectionModel="true" headerGridSingleSelect="false" />
    </body>
    
    <script type="text/javascript">
    	//包括左树、表头、表体的档案
    	var itemTree = new uft.extend.tree.Tree({
    		id : 'itemTree',
    		treeRootNodeText:'产品分类', //默认根节点名称
    		rootVisible : true,//是否显示根节点
    		dataUrl : 'getItemTree.json', //默认数据来源
    		isTreeFilter:true//是否在树的工具栏加上过滤框
    	});
    	${moduleName}.appUiConfig.leftTree=itemTree;	
    	${moduleName}.appUiConfig.treePkField='pk_category';
    	
    	//扩展表头的工具栏,如果是单据页面,那么这里继承uft.jf.BillToolbar
    	MyToolbar = Ext.extend(uft.jf.ToftToolbar, {
    		getBtnArray : function(){
    			var btns = new Array();
    			btns.push(this.btn_query);
    			btns.push(this.btn_add);
    			btns.push(this.btn_copy);
    			btns.push(this.btn_edit);
    			btns.push(this.btn_save);
    			btns.push(this.btn_can);
    			btns.push(this.btn_del);
    			btns.push(this.btn_ref);
    			btns.push(this.btn_list);
    			btns.push(this.btn_card);
    			btns.push(this.btn_prev);
    			btns.push(this.btn_next);
    			btns.push(this.btn_filemanage);
    			btns.push(this.btn_filemanage_pic);
    			btns.push(this.btn_print);
    			btns.push(this.btn_export);
    			return btns;
    		}	
    	});
    	//扩展表体的工具栏
    	MyBodyAssistToolbar = Ext.extend(uft.jf.BodyAssistToolbar,{
    		btn_row_add_handler : function(){
    			MyBodyAssistToolbar.superclass.btn_row_add_handler.call(this);
    			//点击增行时,默认增加100行
    			var grid = this.getActiveBodyGrid(),datas = [];
    			for(var i=0;i<100;i++){
    				var rowDefaultValues = this.getRowDefaultValues(grid.id);
    				datas.push(rowDefaultValues);
    			}
    			grid.addRow(datas);
    			grid.getStore().totalLength=grid.getStore().getTotalCount()+100;
    			grid.updateInfo();
    		}
    	});
    	${moduleName}.appUiConfig.bodyAssistToolbar=new MyBodyAssistToolbar();
    	${moduleName}.appUiConfig.toolbar = new MyToolbar();
    	//如果是单据页面,那么这里是
    	//	var app = new uft.jf.BillPanel(${moduleName}.appUiConfig);
    	var app = new uft.jf.ToftPanel(${moduleName}.appUiConfig);
    	
    	/**
    	 * 表头编辑后事件
    	 *
    	 *@param field 编辑的组件对象
    	 *@param value 编辑后的值
    	 *@param oriValue 编辑前的值
    	*/
    	function afterEditHead(field,value,oriValue){
    		if(field.id = 'vbillno'){
    			//uft.Utils.setColumnHidden('demo_product_detail',{'productprice':true});
    		}
    	}
    	
    	/**
    	*表体编辑后事件
    	*@param e 事件对象,通过这个参数可以得到以下值:
    	*var record=e.record; 当前编辑的行对象
    	var row = e.row; 当前编辑的行号
    	var grid = e.grid; 当前编辑的表格
    	var column = grid.originalColumns[e.column];//当前编辑的列对象
    	var fieldName=e.field; 当前编辑的列的名称
    	var value=e.value; 当前编辑的单元格编辑后的值
    	var originalValue=e.originalValue; 当前编辑的单元格编辑前的值
    	*/
    	function afterEditBody(e){
    		if(e.field == 'categoryname'){
    			//uft.Utils.setColumnHidden('demo_product_detail',{'productprice':true});
    		}else if(e.field =='productprice'){
    			var grid = Ext.getCmp('demo_product_detail');
    			var editor = uft.Utils.getColumnEditor(grid,'vmemo');//vmemo列是一个下拉组件
    			editor.addExtendParams({p:1});
    		}
    	}
    	
    	/**
    	*表体编辑前事件
    	*@param e 事件对象,通过这个参数可以得到以下值:
    	*var record=e.record; 当前编辑的行对象
    	var row = e.row; 当前编辑的行号
    	var grid = e.grid; 当前编辑的表格
    	var column = grid.originalColumns[e.column];//当前编辑的列对象
    	var fieldName=e.field; 当前编辑的列的名称
    	var value=e.value; 当前编辑的单元格编辑后的值
    	var originalValue=e.originalValue; 当前编辑的单元格编辑前的值
    	*/
    	function beforeEditBody(e){
    		//有时候要根据权限去确定用户能不能编辑该单元格,如果不让用户编辑,那么这个方法要返回false
    	}
    		
    	</script>
    	<%@ include file="/common/footer.jsp"%>
    </html>
    

    具体的示例可以参考:http://xuqc.fangwei.name:9080/demo-webapp administrator/143305

  • 相关阅读:
    python自省函数getattr的用法
    python-mysqldb安装
    weblogic部署脚本
    netcat使用
    ssh批量互信脚本
    yum安装出错
    centos文件误删除恢复
    lamp php的ssl,ssh支持
    ssh免密码登陆
    python 学习笔记 四 条件, 循环以及其他
  • 原文地址:https://www.cnblogs.com/aimer311/p/3611545.html
Copyright © 2011-2022 走看看