easyui datagrid rowediting使用心得

前不久使用了easyui的tree,现如今换了项目组,居然整个页面都是使用easyui的,而今我写的模块需要rowediting,有了easyui-tree的使用,我多少对easyui有了一定的了解,在使用rowediting的时候也算的上是熟路,但是奈何框架是封装的框架,有好多规则需要遵守,最后无奈的发现我不是轻车了,可谓之“重车熟路”。

言归正传,使用easyui,必须要把其需要的js、css都准备好了,这个就不多说了,需要的官网上下载。在官网上给的demo中已经有的基本使用的发放了。调用方式如下代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Row Editing in DataGrid - jQuery EasyUI Demo</title>
	<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
	<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
	<link rel="stylesheet" type="text/css" href="../demo.css">
	<script type="text/javascript" src="../../jquery.min.js"></script>
	<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
	<h2>Row Editing in DataGrid</h2>
	<div class="demo-info">
		<div class="demo-tip icon-tip"></div>
		<div>Click the row to start editing.</div>
	</div>
	<div style="margin:10px 0;"></div>
	
	<table id="dg" class="easyui-datagrid" title="Row Editing in DataGrid" style="width:700px;height:auto"
			data-options="
				iconCls: 'icon-edit',
				singleSelect: true,
				toolbar: '#tb',
				url: 'datagrid_data1.json',
				method: 'get',
				onClickRow: onClickRow
			">
		<thead>
			<tr>
				<th data-options="field:'itemid',width:80">Item ID</th>
				<th data-options="field:'productid',width:100,
						formatter:function(value,row){
							return row.productname;
						},
						editor:{
							type:'combobox',
							options:{
								valueField:'productid',
								textField:'productname',
								url:'products.json',
								required:true
							}
						}">Product</th>
				<th data-options="field:'listprice',width:80,align:'right',editor:{type:'numberbox',options:{precision:1}}">List Price</th>
				<th data-options="field:'unitcost',width:80,align:'right',editor:'numberbox'">Unit Cost</th>
				<th data-options="field:'attr1',width:250,editor:'text'">Attribute</th>
				<th data-options="field:'status',width:60,align:'center',editor:{type:'checkbox',options:{on:'P',off:''}}">Status</th>
			</tr>
		</thead>
	</table>

	<div id="tb" style="height:auto">
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true" οnclick="append()">Append</a>
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-remove',plain:true" οnclick="removeit()">Remove</a>
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-save',plain:true" οnclick="accept()">Accept</a>
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-undo',plain:true" οnclick="reject()">Reject</a>
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-search',plain:true" οnclick="getChanges()">GetChanges</a>
	</div>
</body>
</html>
至于工具栏的操作方式的js有很多种,其中我看着比较好的一种多行多种操作后同时提交的方法,这个是在网上查到的,具体地址找不到了,我就把代码贴下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Row Editing in DataGrid - jQuery EasyUI Demo</title>
    <link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="../../themes/icon.css">
    <link rel="stylesheet" type="text/css" href="../demo.css">
    <script type="text/javascript" src="../../jquery.min.js"></script>
    <script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
<h2>Row Editing in DataGrid</h2>
<script type="text/javascript">
    $(function () {
        var $dg = $("#dg");
        $dg.datagrid({
            url: "data.json",
            width: 700,
            height: 250,
            columns: [
                [
                    {
                        field: 'code',
                        title: 'Code',
                        width: 100,
                        editor: "validatebox"
                    },
                    {
                        field: 'name',
                        title: 'Name',
                        width: 200,
                        editor: "validatebox"
                    },
                    {
                        field: 'price',
                        title: 'Price',
                        width: 200,
                        align: 'right',
                        editor: "numberbox"
                    }
                ]
            ],
            toolbar: [
                {
                    text: "添加",
                    iconCls: "icon-add",
                    handler: function () {
                        $dg.datagrid('appendRow', {});
                        var rows = $dg.datagrid('getRows');
                        $dg.datagrid('beginEdit', rows.length - 1);
                    }
                },
                {
                    text: "编辑",
                    iconCls: "icon-edit",
                    handler: function () {
                        var row = $dg.datagrid('getSelected');
                        if (row) {
                            var rowIndex = $dg.datagrid('getRowIndex', row);
                            $dg.datagrid('beginEdit', rowIndex);
                        }
                    }
                },
                {
                    text: "删除",
                    iconCls: "icon-remove",
                    handler: function () {
                        var row = $dg.datagrid('getSelected');
                        if (row) {
                            var rowIndex = $dg.datagrid('getRowIndex', row);
                            $dg.datagrid('deleteRow', rowIndex);
                        }
                    }
                },
                {
                    text: "结束编辑",
                    iconCls: "icon-cancel",
                    handler: endEdit
                },
                {
                    text: "保存",
                    iconCls: "icon-save",
                    handler: function () {
                        endEdit();
                        if ($dg.datagrid('getChanges').length) {
                            //获得增加数据
                            var inserted = $dg.datagrid('getChanges', "inserted");
                            //获得删除数据
                            var deleted = $dg.datagrid('getChanges', "deleted");
                            //获得修改数据
                            var updated = $dg.datagrid('getChanges', "updated");

                            var effectRow = new Object();
                            if (inserted.length) {
                                effectRow["inserted"] = JSON.stringify(inserted);
                                alert("insert:" + JSON.stringify(inserted));
                            }
                            if (deleted.length) {
                                effectRow["deleted"] = JSON.stringify(deleted);
                                alert("delete:" + JSON.stringify(deleted));
                            }
                            if (updated.length) {
                                effectRow["updated"] = JSON.stringify(updated);
                                alert("update:" + JSON.stringify(deleted));
                            }

                            $.post("servlet/commit", effectRow,function (rsp) {
                                if (rsp.status) {
                                    $.messager.alert("提示", "提交成功!");
                                    $dg.datagrid('acceptChanges');
                                }
                            }, "JSON").error(function () {
                                        $.messager.alert("提示", "提交错误了!");
                                    });
                        }
                    }
                }
            ]
        });

        function endEdit() {
            var rows = $dg.datagrid('getRows');
            for (var i = 0; i < rows.length; i++) {
                $dg.datagrid('endEdit', i);
            }
        }
    });
</script>
<table id="dg" title="批量操作"></table>
</body>
</html>
</body>
</html>

以上是html和js代码,下来我大体的说下后台获取方式:

以增加为例:
//设置请求编码
req.setCharacterEncoding("UTF-8");
//获取json字符串
String inserted = req.getParameter("inserted");
if(inserted != null){
	//把json字符串转换成对象
	List<Bean> listInserted = JSON.parseArray(inserted, Bean.class);
       //TODO 你的操作。。。。。。

}


//bean,抽象前台数据为对象,

public class Bean {
	private String code;
	private String name;
	private Double price;
	.....set get 方法省略
}

这个应该可以看懂吧,如果有不懂的地方可以留言。这个是一种很好很快捷的提交数据方式。但是我由于一些特殊原因没法使用,所以下面我发下我的提交数据方式:

function update() {
		$('#dg').datagrid('beginEdit', editIndex);
	}
	function removeit() {
		if (editIndex == undefined) {return}
		var obj = $('#dg').datagrid('getRows')[editIndex];
		var id = obj["id"];
		if(id!=null&&id!=""){
		 $.messager.confirm("操作提示", "您确定要执行删除该属性吗?", function () {
				$('#dg').datagrid('deleteRow', editIndex);
				$('#classActionForm')
						.form(
								'submit',
								{
									url : 'deleteActionClass.cncc?id=' + id,
									onSubmit : function() {
										if ($(this).form("validate")) {
										} else {
											return false;
										}
									},
									success : function(data) {
										var temp = eval('(' + data + ')'); // change the JSON string to javascript object  
										if (temp.success) {
											$.messager.alert('提示', "操作成功", 'info');
											$("#dg")
													.datagrid(
															{
																iconCls : 'icon-edit',
																singleSelect : true,
																toolbar : '#tb',
																url : 'getActionList.cncc?type=${fiatclass.name }&randnum='+Math.floor(Math.random()*1000000),
																loadMsg : '数据加载中请稍后……',
																method : 'get',
																onClickRow : onClickRow
															});
											//$("#dg").datagrid('reload');//重新加载
										} else {
											$.messager.alert("提示", "操作失败,失败原因:"
													+ temp.msg);
										}
									}
								});
				editIndex = undefined;
			 });
		}else{
			 $('#dg').datagrid('rejectChanges');
				editIndex = undefined;
		 }
		
	}
	function accept() {
		$('#dg').datagrid('acceptChanges');
		var obj = $('#dg').datagrid('getRows')[editIndex];
		var actionName = obj["actionName"];
		var actionRemark = obj["actionRemark"];
		var id = obj["id"];
		var displayed = obj["displayed"];
		/*if (displayed == "是") {
			displayed = 1;
		} else {
			displayed = 0;
		}*/
		var used = obj["used"];
		/*if (used == "是") {
			used = 1;
		} else {
			used = 0;
		}*/
		$('#classActionForm')
				.form(
						'submit',
						{
							url : 'saveClassAction.cncc?id='
									+ id
									+ "&actionName="
									+ actionName
									+ "&actionRemark="
									+ actionRemark
									+ "&displayed="
									+ displayed
									+ "&used="
									+ used
									+ "&classid=${fiatclass.id }&classname=${fiatclass.name }",
							onSubmit : function() {
								if ($(this).form("validate")) {
								} else {
									return false;
								}
							},
							success : function(data) {
								var temp = eval('(' + data + ')'); // change the JSON string to javascript object  
								if (temp.success) {
									$.messager.alert('提示', "操作成功", 'info');
									$("#dg")
											.datagrid(
													{
														iconCls : 'icon-edit',
														singleSelect : true,
														toolbar : '#tb',
														url : 'getActionList.cncc?type=${fiatclass.name }&randnum='+Math.floor(Math.random()*1000000),
														loadMsg : '数据加载中请稍后……',
														method : 'get',
														onClickRow : onClickRow
													});
									//$("#dg").datagrid('reload');//重新加载
								} else {
									$.messager.alert("提示", "操作失败,失败原因:"
											+ temp.msg);
									$("#f-submit").linkbutton("enable");
									$("#f-cancel").linkbutton("enable");
								}
							}
						});
	}
	function reject() {
		$('#dg').datagrid('rejectChanges');
		editIndex = undefined;
	}

以上是我的提交数据的方式,我采用的方式单行数据提交,也就是每次新增或修改或删除都进行一次提交。至于后台获取数据的方式大家应该都知道,不过这里我多一句嘴:request.getParameter("name")来获取。

到了这里本来可以结束了,不过想到一个问题,在这个表单中,我们还是会遇到一个小问题,我在这里也说下。关于列表中的ID这一列数据,为了数据安全或者是没有展示的必要性,我们都不需要此列,但是修改的时候这个id值就是必不可少的一个东西,所以我们需要做到的是它即存在,又不可见,也就是隐藏起来,又啰嗦了,直接粘方法吧:

$(function(){
		$("#dg").datagrid({    	
		onLoadSuccess:function(){
	  	 	$('#dg').datagrid("hideColumn","id");      
//$('#dg').datagrid("showColumn","id");   
	   	}});
	});
其中hideColumn是隐藏方法,showColumn是将隐藏的展示出来,id是所隐藏的列。