`

EditGridPanel增加,保存,删除,分页全过程分析

阅读更多

EditGridPanel增加,保存,删除,分页全过程分析

 

一.基础准备:

1.表结构:

 

2.实体类:

public class AppropriateFund {
	private Long id;
	private Long aid;
	private double totalFunds;
	private double country;
	private double province;
	private double county;
	private String fileNo;
	private Date fileDate;
	private String remark;
        ......
        ...set/get
}

 

3.映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-10-24 14:50:17 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.*.*.*.entity.AppropriateFund" table="APPROPRIATE_FUND">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="28" scale="0" />
            <generator class="sequence"> 
               <param name="sequence">SQ_APPROPRIATE_FUND</param>
			</generator>
        </id>
        <property name="aid" type="java.lang.Long">
            <column name="AID" />
        </property>
        <property name="totalFunds" type="double">
            <column name="TOTAL_FUNDS" />
        </property>
        <property name="country" type="double">
            <column name="COUNTRY" />
        </property>
        <property name="province" type="double">
            <column name="PROVINCE" />
        </property>
        <property name="county" type="double">
            <column name="COUNTY" />
        </property>
        <property name="fileNo" type="java.lang.String">
            <column name="FILE_NO" />
        </property>
        <property name="fileDate" type="java.sql.Date">
            <column name="FILE_DATE" />
        </property>
        <property name="remark" type="java.lang.String">
            <column name="REMARK" />
        </property>
    </class>
</hibernate-mapping>

 

二:Extjs设计页面

1.创建Store:

var fundRecord = new Ext.data.Record.create([
	{name:"id",type:"int"},    //注意type类型!
	{name:"aid",type:"int"},
	{name:"totalFunds",type:"float"},
	{name:"country",type:"float"},
	{name:"province",type:"string"},
	{name:"county",type:"string"},
	{name:"fileNo",type:"string"},
	{name:"fileDate",type:"date",format:"Y-m-d"},
	{name:"remark",type:"string"}
]);
var fundProxy = new Ext.data.HttpProxy({url:'getAppropriateFund.pay?doType=getAppropriateFund'});
var fundReader = new Ext.data.JsonReader({
	root:'rows',
	totalProperty:'totalCount'    //分页必须要有该项!
},fundRecord);
var fundStore = new Ext.data.Store({  
    proxy:fundProxy,
    reader:fundReader
});
注意:

 

1).EditGridPanel增加行时需要用到Record,所以此处创建Store必须用Record!

2).Record没有long和double类型!

3).若要分页,则Reader必须加上totalProperty属性!


 

 

2.创建ColumnModel:

var fundSm = new Ext.grid.CheckboxSelectionModel();//表格面板的复选框
var fundCm = new Ext.grid.ColumnModel({
	defaultSortable:false,//默认排序
	columns:[
		fundSm,//复选框
               {
			header:"编号",
			dataIndex:"id",
			hidden:true,
			width:50
		},{
			header:"项目ID",
			dataIndex:"aid",
			hidden:true,
			width:50
		},{
			header:"总下达资金",
			dataIndex:"totalFunds",
			align:"center",
			editor:new Ext.form.NumberField({
				 decimalPrecision: 2,
				 minValue: 0.01
			}),
			width:100
		},{
			header:"中央资助金额",
			dataIndex:"country",
			align:"center",
			editor:new Ext.form.NumberField({
				decimalPrecision: 2,
				minValue: 0.01
			}),
			width:100
		},{
			header:"省资助金额",
			dataIndex:"province",
			align:"center",
			editor:new Ext.form.NumberField({
				decimalPrecision: 2,
				minValue: 0.01
			}),
			width:100
		},{
			header:"县资助金额",
			dataIndex:"county",
			align:"center",
			editor:new Ext.form.NumberField({
				decimalPrecision: 2,
				minValue: 0.01
			}),
			width:100
		},{
			header:"下达政策文件号",
			dataIndex:"fileNo",
			align:"center",
			editor:new Ext.form.TextField(),
			width:150
		},{
			header:"下达政策时间",
			dataIndex:"fileDate",
			align:"center",
			editor:new Ext.form.DateField({
				format:'Y-m-d',
				readOnly:true
			}),
			renderer :function(v,p,r){
				if(r.data.id==-1){
					return "";
				}else if(v==null||v==""){
					return "";
				}else{
					return regDate(v,p,r);
				}
			},
			width:120
		},{
			header:"备注",
			dataIndex:"remark",
			align:"center",
			editor:new Ext.form.TextField(),
			width:150
		}
	]
});
注意:

1).复选框需要在ColumnModel中加入。

    

2).注意NumberField的精度

    

3).注意DateField的日期格式化

    

 

3.创建EidtGridPanel:

var fundGrid = new Ext.grid.EditorGridPanel({
	title:"资金明细",
	layout:"fit",
	sm:fundSm,          //复选框
	cm:fundCm,          //ColumnModel
	ds:fundStore,       //Store
	clicksToEdit:1,      //单击几次可编辑
	stripeRows:true,   //斑马条纹
	loadMask:{msg:'正在加载数据,请稍侯……'},
	tbar:[
		{
			text:"保存",
			iconCls:"save",
			handler:saveFund
		},{
			text:"增加行",
			iconCls:"add",
			handler:addFund
		},{
			text:"删除行",
			iconCls:"remove",
			handler:removeFund
		}
	],
	bbar: new Ext.PagingToolbar({
        pageSize: pageSize,
        store: fundStore,
        displayInfo: true,
        displayMsg: '当前显示 {0} - {1} ,共{2}条记录',
        emptyMsg: "没有数据",
        items: ['-']
    })
});

注意:

1.分页必须要有Store,并且该Store必须要有totalProperty属性!
     

返回的分页数据:

 

{
  totalCount: 2,//注意:分页的话必须要有该项
  rows: [
    {
      "aid": 27,
      "country": 0,
      "county": 1800,
      "id": 42,
      "province": 200,
      "totalFunds": 2000
    },
    {
      "aid": 27,
      "country": 0,
      "county": 0,
      "id": 41,
      "province": 10000,
      "totalFunds": 10000
    }
  ]
}

 

4.Extjs:增加一列空行

/*增加一行资金空行信息*/
function addFund(){
	var newFund = new fundRecord({
		id:-1,     //id为-1是为了Dao中判断插入还是更新
		aid:aid,
		totalFunds:0,//注意:这里若默认为"",在不输入值的情况下,后台取值会报错!!!
		country:0,
		province:0,
		county:0,
		fileNo:"",
		fileDate:"",
		remark:""
	})
	fundGrid.stopEditing();	//关闭表格的编辑状态
	fundStore.add(newFund);
	fundGrid.startEditing(0,0); 
}
     
 

5.Extjs:保存资金信息

/*保存资金信息*/
function saveFund(){
	//只提交修改过的记录
	var records = fundStore.getModifiedRecords();  //获取更改过的记录
	if(records && records.length > 0){
		Ext.Msg.wait("正在保存...");
		var rows = new Array();
		for (var i = 0; i < records.length; i++) {
			var record = records[i];
			var row = new Object();
			var fields = record.data;
			var totalFunds = fields["totalFunds"];
			var country = fields["country"];
			var province = fields["province"];
			var county = fields["county"];
			if (totalFunds != (country + province + county)) {
				Ext.Msg.alert("系统提示","各级资助金额总和必须等于总下达资金");
				return;
			}
			row = {id:fields.id,aid:fields.aid,totalFunds:fields.totalFunds,country:fields.country,province:fields.province,
				county:fields["county"],fileNo:fields["fileNo"],fileDate:fields["fileDate"],remark:fields["remark"]};
			rows.push(row);
		}//此处展示了Js的两种不同的取值方式
		//发送异步请求,保存数据
		Ext.Ajax.request({
			url:"updateAppropriateFund.pay?doType=updateAppropriateFund",
			method:"POST",
			timeout:300000,
			params:{updateSets:Ext.encode(rows)},//将对象编码转化为Json字符串
			success:success,
			failure:function(){Ext.Msg.alert('信息','未成功提交数据!'); }			
		});
		function success(response,options){
			var result = Ext.decode(response.responseText);//返回值转码
			 if(result.success){  
              Ext.Msg.hide();  
              Ext.Msg.show({title:'成功',  
                        msg: '数据保存成功',  
                        buttons: Ext.Msg.OK,  
                        icon: Ext.MessageBox.INFO});      
              //保存成功后刷新修改过的脏数据。  
              fundStore.rejectChanges();  
              fundStore.reload();  
			 }else{  
              Ext.Msg.hide();  
              Ext.Msg.alert('信息','保存数据未成功!');  
           }  
		}
	}
}
注意:

1.获取修改过的记录进行提交
     

2.要将修改过的记录编码转化为Json字符串,再传到后台

3.数据保存成功后,需要将改变的记录去除掉,再重新加载!
         
 

6.Java:增加或更新资金信息

Servlet:
else if ("updateAppropriateFund".equals(action)) {
	String str;
	AppropriateDao dao = new AppropriateDao();
	String fundsStr = request.getParameter("updateSets");
	JSONArray jArray = new JSONArray(fundsStr);
	List<AppropriateFund> funds = new ArrayList<AppropriateFund>();
	if (jArray != null) {
		for (int i = 0; i < jArray.length(); i++) {
			AppropriateFund fund = new AppropriateFund();
			JSONObject jObject = jArray.getJSONObject(i);
			fund.setId(jObject.getLong("id"));
			fund.setAid(jObject.getLong("aid"));
			fund.setTotalFunds(jObject.getDouble("totalFunds"));
			fund.setCountry(jObject.getDouble("country"));
			fund.setProvince(jObject.getDouble("province"));
			fund.setCounty(jObject.getDouble("county"));
			fund.setFileNo(jObject.getString("fileNo"));
			if (jObject.getString("fileDate") != null && !jObject.getString("fileDate").equals("")) {
				fund.setFileDate(Date.valueOf(jObject.getString("fileDate").substring(0, jObject.getString("fileDate").lastIndexOf("T"))));
			}
			fund.setRemark(jObject.getString("remark"));
			funds.add(fund);
		}
	}
	boolean done = dao.addOrUpdateApprociateFund(funds);
	if(done){
		str="{success:true}";
	}else{
		str="{success:false}";
	}
	response.setContentType("text/html;charset=UTF-8");
	PrintWriter out=response.getWriter();
	out.print(str);		
	out.close();
	return;
}
Dao:
/**
 * 增加或更新资金
 * @return
 */
public boolean addOrUpdateApprociateFund(List<AppropriateFund> funds) {
	boolean done = false;
	Session s = null;
	try {
		s = HibernateUtil.getSession();
		s.beginTransaction();
		for (int i = 0; i < funds.size(); i++) {
			AppropriateFund fund = funds.get(i);
			if (fund.getId() == -1) {
				s.save(fund);
			}
			else {
				s.update(fund);
			}
		}
		s.getTransaction().commit();
		done = true;
	} catch (Throwable e) {
		logger.error(e.toString());
		HibernateUtil.endSession(s);
	} finally {
		HibernateUtil.endSession(s);
	}
	return done;
}
注意Ajax请求的返回值!!!

 

 
7.Extjs:删除一行或多行记录(通过获取勾选的记录来删除)
function removeFund(){
	var rcs = fundGrid.getSelectionModel().getSelections();  //获取勾选的记录
    if(!rcs||rcs.length<1){  
        Ext.Msg.alert("提示","请先选择要删除的行");  
        return;  
    }  
    else{  
        Ext.Msg.confirm("确认删除","请确认是否删除选中的项目支出条目?",function(btn){  
            if(btn == "yes"){//选中"是"的按钮  
                var ids = new Array();  
                for (var i = 0; i < rcs.length; i++) {  
                    ids.push(rcs[i].get("id"));  
                }  
                //异步发请求  
                Ext.Ajax.request({  
                    url:"deleteFunds.pay?doType=deleteFunds",  
                    method:"POST",  
                    params:{fundIds:ids.join(",")},  
                    success:function(response,option){  
                        var result = Ext.util.JSON.decode(response.responseText);  
                        if (result.success) {  
                            Ext.Msg.alert("删除成功","选中的下达资金信息已成功删除!");  
                            fundStore.rejectChanges();  
                            fundStore.reload();  
                        }
                        else {
                        	Ext.Msg.alert("删除失败","选中的下达资金信息删除失败!");  
                            fundStore.rejectChanges();  
                            fundStore.reload();  
                        }
                    },  
                    failure:function(response,option){  
                        Ext.Msg.alert("删除失败","删除过程中发生错误!");  
                    }  
                });  
            }  
        });  
    }  
}
注意:
1.获取勾选的记录进行删除。
2.可能是多个记录,需要拼接为字符串传到后台。
3.无论删除成功与否,都要清除掉修改过的记录并重新加载!

 
8.Java:删除一行或多行记录
Servlet:
else if ("deleteFunds".equals(action)) {
	String str;
	AppropriateDao dao = new AppropriateDao();
	String idStr = request.getParameter("fundIds");
	String[] idsArr = idStr.split(",");//分割字符串
	boolean done = dao.deleteAppropriateFunds(idsArr);
	if(done){
		str="{success:true}";
	}else{
		str="{success:false}";
	}
	response.setContentType("text/html;charset=UTF-8");
	PrintWriter out=response.getWriter();
	out.print(str);		
	out.close();
	return;
}
Dao:
/**
 * 删除资金信息
 * @param idsArr
 * @return
 */
public boolean deleteAppropriateFunds(String[] idsArr) {
	boolean done = false;
	Session s = null;
	try {
		s = HibernateUtil.getSession();
		s.beginTransaction();//注意必须开启事务
		StringBuffer ids = new StringBuffer();
		if (idsArr != null && idsArr.length > 0) {
			for (int i = 0; i < idsArr.length; i++) {
				ids.append(idsArr[i]);
				if (i != idsArr.length - 1) {
					ids.append(",");
				}
			}
		}
		SQLQuery query = s.createSQLQuery("delete from appropriate_fund where id in(" + ids +")");
		query.executeUpdate();
		s.getTransaction().commit();
		done = true;
	} catch (Throwable e) {
		logger.error(e.toString());
		HibernateUtil.endSession(s);
	} finally {
		HibernateUtil.endSession(s);
	}
	return done;
}
 
 图示:

 

 

 

 

 

 

 

  • 大小: 15.7 KB
  • 大小: 5 KB
  • 大小: 8 KB
  • 大小: 7.5 KB
  • 大小: 12.4 KB
  • 大小: 2.8 KB
  • 大小: 12.8 KB
  • 大小: 3.2 KB
  • 大小: 6.2 KB
  • 大小: 13.9 KB
  • 大小: 28.4 KB
  • 大小: 6.7 KB
  • 大小: 6.8 KB
  • 大小: 10.7 KB
  • 大小: 7.1 KB
分享到:
评论

相关推荐

    高效分页存储过程 高效分页存储过程

    高效分页存储过程的实现对于优化数据库性能至关重要。本文将深入探讨如何创建和使用高效的分页存储过程,并针对SQL Server 2005及2010提供一个实用的例子。 首先,理解分页的基本概念。分页通常涉及到两个关键参数...

    分页存储过程 分页存储过程 分页存储过程

    分页存储过程 分页存储过程 分页存储过程 sql代码

    oracle 增加,删除,修改和分页存储过程

    在这个“Oracle增加、删除、修改和分页存储过程”项目中,我们将深入探讨这四个核心的数据库管理功能,并了解如何在PL/SQL环境中实现它们。 1. **增加(Insertion)**: 在Oracle中,创建一个用于插入数据的存储...

    sql Server 通用分页存储过程

    sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程

    万能分页存储过程

    ### 万能分页存储过程知识点详解 #### 一、概述 在数据库操作中,分页查询是一项常用且重要的技术,特别是在数据量较大的场景下,能够显著提高用户体验和系统性能。本文将详细介绍一个名为“万能分页存储过程”的...

    oracle分页存储过程

    oracle分页存储过程,oracle分页存储过程

    效率高的分页存储过程实现的分页

    本文将深入探讨如何通过使用存储过程来实现高效的分页存储过程,特别是针对ASP.NET应用程序。 标题 "效率高的分页存储过程实现的分页" 提到的是一种优化数据检索的技术。在ASP.NET开发中,GridView控件是常用的数据...

    MySql 分页存储过程以及代码调用

    本篇文章将深入探讨MySQL中的分页存储过程及其代码调用方法。 首先,理解分页的基本概念。在网页或应用程序中,我们通常会看到“上一页”、“下一页”这样的导航,这就是分页的表现形式。分页查询通过设置每页显示...

    MYSQL分页存储过程

    本文将深入解析MySQL中的分页存储过程,通过实例代码讲解其工作原理与实现步骤。 ### MySQL分页存储过程概述 分页存储过程是一种在数据库层面上实现数据分页的技术。相比应用程序级别的分页,它能更高效地处理数据...

    分页存储过程示例系统

    在IT领域,分页存储过程是数据库管理中的一个重要概念,特别是在构建大规模的Web应用程序时,如新闻系统。分页能够有效地提高用户体验,因为用户可以逐步加载数据,而不是一次性加载所有内容,这降低了服务器的负担...

    Oracle 分页存储过程 终极版

    为了解决这个问题,高效的分页存储过程会结合`ROW_NUMBER()`窗口函数或者`RANK()`、`DENSE_RANK()`等,这些函数可以在查询过程中直接确定每行的顺序号,从而避免了全表扫描。此外,通过在`WHERE`子句中加入`ROWNUM`...

    sqlserver 分页存储过程

    SQL Server 分页存储过程是一种在数据库中实现高效数据分页查询的方法。在大型数据集的展示中,分页是必不可少的,因为它允许用户逐步浏览数据,而不是一次性加载所有记录,从而提高用户体验并减少服务器负载。以下...

    通用分页存储过程

    ### 通用分页存储过程知识点解析 #### 一、存储过程概述 在数据库管理系统中,存储过程是一种预先编译并存储在数据库中的SQL程序。它能够接收参数,并根据这些参数执行复杂的逻辑操作,如数据查询、更新等。通过...

    c#调用分页存储过程

    "C#调用分页存储过程"是一个常见的技术实践,它结合了C#编程语言和SQL Server的存储过程来高效地获取数据库中的分页数据。这种方法可以有效地减少网络传输的数据量,提高用户界面的响应速度,尤其是在数据量达到百万...

    Oracle分页存储过程

    oracle分页存储过程详细的编码 可直接使用 拿去使用吧

    C#调用分页存储过程实例

    在SQL Server中,通过存储过程实现分页查询可以优化性能,避免全表扫描。 C#调用存储过程通常涉及到以下步骤: 1. **建立连接**:使用`SqlConnection`类创建数据库连接,需要提供正确的连接字符串,包括数据库...

    分页存储过程 存储过程分页

    分页存储过程 分页存储过程分页存储过程分页存储过程

Global site tag (gtag.js) - Google Analytics