datagrid直接编辑保存“设计缺陷”

当今使用easyUI的datagrid组件的时候,碰到了一些问题,记录下来以便下次高速解决。

需求是在一张表单里会关联有一个列表,能够增删查改

曾经没用easyUI的时候,这个增和改的页面我通常是用一个dialog来做。保存之后再ajax传到列表里通过hidden来进行提交。

当然如今我也能够这么做,可是我想换种方式,由于easyUI的datagrid提供了直接在datagrid上编辑的功能(Row Editing in DataGrid)。

照着官网上的demo试了一下。也就是editor的应用。编辑倒是没问题,保存也OK

可是保存的时候是直接把value转换成text来保存的。这么一来的话,value的信息就消失了。

比方说是一个combobox。那么保存完就仅仅有text的信息了。

那在保存完之前总是能获取到value的。试了一下,第一想法是想从editor生成的input下手得到数据,毕竟用form来提交是最熟悉的方式啊,可是发现editor都没有指定name的地方(或许是我不知道),所以不好得到数据。既然不行,那么还是通过datagrid的getSelected方法来得到当前选中行(这里要先停止当前的编辑(endEdit)之后才干拿到填的数据)。

var row = $('#dispatches_details').datagrid('getSelected');

这里得到的row是一个json,且里面的combobox得到的都是value

到了这步。假设外层没有关联表单(也就新建一条就保存)的情况下,那么直接把row发到后台就能够保存了,之后显示就仅仅须要text而不须要value的信息,这或许就是datagrid设计的初衷吧。可是它可能没有考虑到稍复杂的关联表单的情况。比方我们这里的业务,保存到数据库肯定是在外层表单提交的时候一起保存的,所以这个row的数据我们要临时先记录下来。

怎么记录呢?在js里可能就仅仅有array这样的保存一串数据的数据类型了吧。于是创建了一个array(rows)来保存row

问题又来了,那么js中的array怎么传到后台呢?这也是困扰了我一个下午的问题。

我先是直接用{”rows”:rows}这种格式postserver。抓了HTTP请求。实际上发的请求參数是这种{rows[0][a], rows[0][b],......rows[1][a], rows[1][b].......}当中a、b是row中的字段名

看到这样的情况果断还非常开心啊,以为Spring能够自己主动绑定參数了。百度了一下于是跑到server

写下一行代码:

public void saveDispatches(@RequestParam("rows[]") Ddetails ddetails[])

满心以为能够直接接到数据了。结果发现接不到。又试了

public void saveDispatches(@RequestParam("rows[][]") Object ddetails[][])都不行

最后直接request.getParameter(“rows[0][a]”)这样倒是有了,尼玛啊,这样接參数还不得接到死啊。

只是这样的方式我也仅仅是试试而已。js的array直接传递到后台肯定会有问题。

再一想,列表中的每一条记录最好都给一个name。然后value就是这条row(json类型)。比方说类似row1:””, row2:””, row3:””

想了一下认为还是不可行。由于參数的数量不确定,后台没有一个好的方法来接參数

后来从form传数据得到灵感,能够用同样的名字,然后用分隔符分开,后台能够得到一个数组。可是这样事实上后台得到的就是json的数据,没办法直接绑定參数到实体了。

可是这里另一个问题。我发现json在作为array的一个元素的时候,HTTP请求过去的时候,不会自己转换成字符串,而是会以rows[a],row[b] 这样的形式发送

这并非我们想要的,于是先要把json转换成string类型:

$.extend({
	toStr:function(json){
		var str = "";
		$.each(json, function(k,v){
			str += "," + k + ':"' + v + '"';
		});
		str = "{" + str.substring(1) + "}";
		return str;
	}
})

接下来表单提交的时候。就能够这么传数据:

	$("#dispatches_form").form('submit', {
		url:'repairs/saveDispatches',
	    onSubmit: function(param){
	    	param.ddetails = jsonArr.join('@');
	    },
	    success:function(data){
	        $.messager.progress('close');
	        $("#repairsPaper").dialog('close');
	    }
	});

这样后台就能接到json格式的字符串了,再通过“@”分开成一条条json记录,接下来

就须要我们手动绑定到实体了,为了防止还有这样的需求。于是写了一个还算通用的将json和实体绑定的方法:

	public static <T> T transferFromJsonObject(Class<T> clazz,
			JSONObject jsonObject) {
		T t = null;
		try {
			t = clazz.newInstance();
			Field[] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				field.setAccessible(true);
				Object value;
				if ((value = jsonObject.get(field.getName())) != null
						&& StringUtils.isNotEmpty((String) value)) {
					if (field.getType() == Date.class) {
						SimpleDateFormat format = new SimpleDateFormat(
								"yyyy-MM-dd");
						value = format.parse((String) value);
					} else if (field.getType() == Integer.class) {
						value = Integer.parseInt((String) value);
					} else if (field.getType() == Double.class) {
						value = Double.parseDouble((String) value);
					}
					field.set(t, value);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return t;
	}

至此。虽然过程曲折相对,但最终得到~

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-19 08:48:10

datagrid直接编辑保存“设计缺陷”的相关文章

datagrid直接编辑保存的“设计缺陷”

今天在使用easyUI的datagrid组件的时候,碰到了一些问题,记录下来以便下次快速解决. 需求是在一张表单里会关联有一个列表,可以增删查改 以前没用easyUI的时候,这个增和改的页面我一般是用一个dialog来做,保存之后再ajax传到列表里通过hidden来进行提交. 当然现在我也可以这么做,但是我想换种方式,因为easyUI的datagrid提供了直接在datagrid上编辑的功能(Row Editing in DataGrid). 照着官网上的demo试了一下,也就是editor的

datagrid直接编辑保存的“设计缺陷”之二

datagrid直接编辑保存的"设计缺陷"只是解决了如何让后台能接收到前台的数据 但是,如何处理前台数据短暂的保存,对我来说还是有点疑惑~ 所以本篇文章是接上篇文章的后续处理~重点并不是在讨论"设计缺陷"了~ 因为貌似js中没有集合类型,所以这里用js中的array来保存数据. 那么这里有几个问题: 1.每次编辑完成(endEdit)的时候将编辑行保存,这里完成编辑包括三种情况(保存.新增和点击另一行) 值得注意的是,这里点击datagrid之外的input或者其他

datagrid行编辑如何实现级联?

还是级联的问题,不过这一次,是在datagrid里,那么难度上肯定比form中的级联要高. 但是只要熟练掌握了datagrid的API,问题还是很容易就可以解决的. 关键点在于--editor,关于datagrid实现编辑功能全要靠它. 先实现行编辑 比如在datagrid中要实现某一列可编辑,那么需要在那一列的column中配置editor属性 editor的配置可以只指定type,也就是编辑框的类型,可以是combobox,datebox等easyUI配备的一些类型 若对这些编辑框有额外的属

easyui datagrid 批量编辑和提交

前台主要代码: <script type="text/javascript"> $(function() { var $dg = $("#dg"); $dg.datagrid({ url : "servlet/list", width : 700, height : 250, columns : [ [ { field : 'code', title : 'Code', width : 100, editor : "vali

BOS项目 第6天(业务受理、自动分单、工作单快速录入、datagrid行编辑)

BOS项目笔记 第6天 今天内容安排: 1.业务受理环节分析 2.创建业务受理环节对应的数据表(业务通知单.工单.工作单) 3.实现业务受理.自动分单 4.datagrid的编辑功能 5.基于datagrid编辑功能实现工作单快速录入功能 6.演示权限控制demo 1. 业务受理分析 受理环节,是宅急送业务的开始,作为服务前端,客户通过电话.网络等多种方式进行委托,业务受理员通过与客户交流,获取客户的服务需求和具体委托信息,将服务指令输入我司服务系统. 客户通过打电话的方式进行物流委托,一个客户

subGrid实现内外datagrid都可编辑功能

前一篇文章介绍了如何创建一个拥有subGrid的datagrid,不过仅仅是展示数据,并未涉及到编辑 那么,若是需要subGrid实现可编辑功能该怎么做呢? 要解决这个问题首先得有一个清晰的思路和明确的目标,到底需要将subGrid打造成怎么样呢? 还是用一个具体的例子来说明问题,就拿最近在做的项目来看吧,有一个需求是这样的: 1.显示所有派去维修的记录(一人一条),且每条记录有一些费用数据 2.每条派工记录中有详细的耗材记录 3.耗材要有添加修改删除的功能 这其实就是典型的"一条记录头,下面多

SpringMVC+easyUI中datagrid行编辑模式(添加数据)实现_2014.5.2

一.概述 根据我们平常的习惯,一共有两种修改模式,一种是弹窗是修改,将原有的数据提取到dialog上,然后再重新提交到后台(好像easyui里面有个onAfterEdit,这个事件里面有三个参数,其中的一个参数就是发现数据是否有改变),而第二种方式就是实现行编辑模式,在原有的datagrid上添加一个空行,(本例是实现添加数据,不考虑原有数据). 二.实现 1.后台就不赘言了.直接上代码,但是我还是有个疑问,对于SpingMVC的Controller层次中的方法的**入参**,我在前台通过aja

flex中dataGrid的编辑功能

flex中dataGrid的编辑功能 在flex的dataGrid中,很多情况下列是需要嵌入其他的控制的,比如:checkbox,combox等,此时需要利用dataGrid的如下功能: 1.datagrid编辑功能简介     当我们点击datagrid中的一个单元格进行编辑时,可结合使用一些组件,RadioButtonGroup.checkbox.ComboBox等     datagrid的编辑功能必须使用以下组件:editorDataField.itemEditor和itemRender

EasyUI效果--DataGrid的编辑效果

DataGrid的编辑效果是我目前使用的easyUI的第三个效果,相对于前两个,这个算是比较复杂点了.    运行起来的效果,大概就是这样,任意点击某行,然后该行变为可以编辑的,失去焦点之后,该行恢复.点击上面的按钮Append,Remove,Accept,Reject,getChanges可以添加一行,删除一行,保存修改,撤销修改,获取改变的数据.    之前拿到官网的源码之后,进行测试.开始没细看代码,删了几列数据,包括Product列,就发现只有第一次点击数据会有编辑效果,并且之后不论怎么