java_easyui体系之DataGrid(3)

java_easyui体系之DataGrid(3)


一:简介

 

        在2的基础上实现增删改、增、改都是通过行编辑来实现的。具体业务逻辑:

        1、  增加一条记录的时候:

                a)        在datagrid表格最前端增加一行(当然也可在指定位置增加、)增加的行的字段必须与要显示的行的字段相同、或者用于存入数据库的更多信息,

                b)        当有一条新增记录没有被保存时不能再增加新的行

                c)        点击保存按钮、保存新增记录

                d)        未保存之前点击撤销按钮、取消新增行

        2、  修改一条记录的时候

                a)        可以选择一条记录、点击修改之后出现可编辑状态

                b)        可以双击一条记录直接出现可编辑状态、

                c)        不管是那种进入修改的方式、都只能同时修改一条记录、并且密码列不允许编辑

                3、  撤销功能:

                a)        当点击新增、出现新增行之后、不想修改则可以取消新增

                b)        当进入修改状态时、不想修改、点击撤销可取消修改状态

                4、  删除:

                a)        可同时删除多条记录、在删除之前会给出确认框、用于避免误删。

                5、  关于新增、修改的与后台的交互操作、都是通过datagrid的onAfterEdit事件来完成的。具体的逻辑可根据自己的需要自行扩展

                6、  对处于可编辑状态行的输入信息框进行了扩展:

                a)        对用于选择时间的input扩展了一个datetimebox可以精确选择时间的功能

                b)        对某列是否具有可编辑功能进行了扩展

 

二:关键之处


        1、效果图:




        2、datetimebox的扩展及使用方式


                   a)扩展代码:在自己定义的js中、页面必须引入此js文件

/**
 * 扩展的关于编辑状态的 对要输入日期的控件使用
 */
$.extend($.fn.datagrid.defaults.editors, {
	datetimebox: {
		init: function(container, options){
			var editor = $('<input />').appendTo(container);
			options.editable = false;
			editor.datetimebox(options);
			return editor;
		},
		getValue: function(target){
			return $(target).datetimebox('getValue');
		},
		setValue: function(target, value){
			$(target).datetimebox('setValue', value);
		},
		resize: function(target, width){
			$(target).datetimebox('resize',width);
		},
		destroy: function(target){
			$(target).datetimebox('destroy');
		},
	}
});

                   b)使用方式:是在datagrid初始化时用于显示时间的相应列上加的属性、可见页面源码

				title : '创建时间',
				field : 'createTime',
				width : 100,//必须要给
				editor : {
					type:'datetimebox',//扩展的用于选择具体时间的类型
					options:{
						required: true,
					}
				}


        3、editor的扩展及使用方式


                   a)扩展代码:在自己定义的js中、页面必须引入此js文件


/**
 * 动态的选择处于修改状态的行中的某些列是否可编辑
 */
$.extend($.fn.datagrid.methods, {
	addEditor : function(jq, param){
		if(param instanceof Array){
			$.each(param, function(index, item){
				var e = $(jq).datagrid('getColumnOption', item.field);
				e.editor = item.editor;
			});
		} else {
			var e = $(jq).datagrid('getColumnOption', param.field);
			e.editor = param.editor;
		}
	},
	removeEditor : function(jq, param){
		if(param instanceof Array){
			$.each(param, function(index, item){
				var e = $(jq).datagrid('getColumnOption', item);
				e.editor = {};
			});
		} else {
			var e = $(jq).datagrid('getColumnOption', param);
			e.editor = {};
		}
	}
});


                  b)使用方式:是在点击修改按钮时触发的函数中、同样双击事件中也要加上、保持一致。

 

				text : '修改',
				iconCls : 'icon-edit',
				handler : function() {
					var rows = $('#datagrid').datagrid('getSelections');
					if(rows.length ==1){
						//修改时、取消密码一栏的可编辑状态
						$('#datagrid').datagrid('removeEditor', 'passWord');
						
						if(editRow != undefined){
							$('#datagrid').datagrid('endEdit', editRow);
						}
						if(editRow == undefined){
							var rowIndex = $('#datagrid').datagrid('getRowIndex',rows[0]);
							$('#datagrid').datagrid('beginEdit',rowIndex);
							editRow = rowIndex;
							$('#datagrid').datagrid('unselectAll');
						}
					}else if( rows.length == 0){
						$.messager.alert('提示', '请选择一条修改记录!','info');
					}else if(rows.length >= 1){
						$.messager.alert('提示', '只能选择一条修改记录!','info');
					}
				}


三:页面源码


        各个方法代码中都有很明确的注释、不再单独赘述。

        1、首页 datagrid2


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'original.jsp' starting page</title>
    
    <link rel="stylesheet" type="text/css" href="css/easyui/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="css/easyui/icon.css">
    <link rel="stylesheet" type="text/css" href="css/easyui/demo.css">
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="js/chyUtils.js"></script>
    
    <script type="text/javascript">
    	function userManage(id){
    		console.info(id);
    		if("door" == id){
    			$('#tt').tabs('select', 0);
    		}
    		if("userManage" == id){
    			$('#tt').tabs('select', 1);
    		}
    	}
    </script>
  </head>
  
	<body id="blayout" class="easyui-layout">
	    <div data-options="region:'north', split:false" style="height:100px;"></div>
	    <div data-options="region:'east',title:'在线列表',split:true" style="width:160px;"></div>
	    <div data-options="region:'west',title:'功能导航',split:true" style="width:160px;">
	    	<div class="easyui-accordion" data-options="fit:true,border:false">
                <div title="Title1" data-options=" iconCls:'icon-save'" style="padding:10px;">
                	content1
                </div>
                <div title="Title2" data-options="fit:true,border:false,iconCls:'icon-reload',selected:true" style="padding:10px">
                    <ul>
                    	<li><a id="door"  class="easyui-linkbutton" οnclick="userManage(id);" data-options="plain:true">门户</a> </li>
                    	<li><a id="userManage" class="easyui-linkbutton" οnclick="userManage(id);" data-options="plain:true">用户管理</a></li>
                    </ul>
                </div>
            </div>
	    </div>
	    <div data-options="region:'center',title:'欢迎',"style="overflow: hidden;">
	    	<div id="tt" class="easyui-tabs" data-options="fit:true,border:false,">
			<div title="门户" data-options="closable:true" >
				门户
			</div>
			<div id="userManage" title="用户管理" data-options="href:'user.jsp',closable:true" >
			</div>
		</div>
	    </div>
	</body>
</html>


        2、user.jsp:

<script type="text/javascript">
	$(function() {
		var editRow = undefined;//用于存放当前编辑行的index

		$('#datagrid').datagrid({
			url : 'login_getJson.action',
			title : '用户列表',
			iconCls : 'icon-save',
			pagination : true,
			pageSize : 10,
			pageList : [ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ],
			fit : true,//使表格自适应
			fitColumns : true,//使得表格中所有的列宽相加等于自适应的宽度、也就是浏览器改变大小的时候下方会不会出现滚动条、一般只有在列较少的时候使用
			nowrap : false,//表格中的文字可以换行、默认是false、不能换行、这样在文字很多的时候就看不到全部:使用真实的数据去测试
			border : false,
			idFeild : 'id',//标识、会记录我们选中项的id、不一定是id、通常使用主键
			sortName : 'id',//设置默认排序时的 字段(必须是field中的一个字段)
			sortOrder : 'asc',//是按照升序还是降序排序	但是仅仅添加这两个字段并不会自动排序、这样写的意义就是前台会自动的向后台传递两个参数:sort order,我们可以在后台查询记录的时候进行排序
			columns : [ [ {
				title : '编号',
				field : 'id',
				width : 100,//必须要给
				//sortable:true,//指定按照这个排序
				checkbox : true,
				
			}, {
				title : '姓名',
				field : 'userName',
				width : 100,//必须要给
				editor : {
					type:'validatebox',
					options:{
						required: true,
					}
				}

			}, {
				title : '密码',  
				field : 'passWord',
				width : 100,//必须要给
				editor : {
					type:'validatebox',
					options:{
						required: true,
					}
				}
			}, {
				title : '创建时间',
				field : 'createTime',
				width : 100,//必须要给
				editor : {
					type:'datetimebox',//扩展的用于选择具体时间的类型
					options:{
						required: true,
					}
				}
			}, {
				title : '修改时间',
				field : 'updateTime',
				width : 100,//必须要给
				editor : {
					type:'datetimebox',//扩展的用于选择具体时间的类型
					options:{
						required: true,
					}
				}

			} ] ],
			toolbar : [ {
				text : '增加',
				iconCls : 'icon-add',
				handler : function() {
					
					if(editRow != undefined){
						$('#datagrid').datagrid('endEdit', editRow);
					}
					if(editRow == undefined){
						$('#datagrid').datagrid('addEditor', {
							field : 'passWord',
							editor : {
								type:'validatebox',
								options:{
									required: true,
								}
							}
						});
						
						$('#datagrid').datagrid('insertRow', {
							index : 0,
							row : {
								id : "1",
								userName:'请输入名称',
								passWord:'请输入密码'
							}
						});
						editRow = 0;
						$('#datagrid').datagrid('beginEdit',0);
						
						/* 在最后一行添加一个增加行。
						$('#datagrid').datagrid('appendRow', {

						});
						var rows = $('#datagrid').datagrid('getRows').length;
						$('#datagrid').datagrid('beginEdit',rows-1);
						*/
					}
				}
			}, '-', {
				text : '删除',
				iconCls : 'icon-remove',
				handler : function() {
					var rows = $('#datagrid').datagrid('getSelections');
					if(rows.length > 0){
						$.messager.confirm('请确认','您确定要删除当前选择的'+rows.length+'项吗?', function(option){
							if(option){
								//一般将id的一个集合传到后台删除
								var ids = [];
								for(var i = 0; i< rows.length; i++){
									ids.push(rows[i].id);
								}
								console.info(ids.join(','));
								/*在这里将id拼接的字符串传到后台、将其删除、调用ajax、在
									ajax的success中再重新加载一下datagrid表格:
									$('#datagrid').datagrid('load',{});
								*/
								
							}
						});
					}else{
						$.messager.alert('提示', '请选择要删除的记录', 'error');
					}
				}
			}, '-', {
				text : '修改',
				iconCls : 'icon-edit',
				handler : function() {
					var rows = $('#datagrid').datagrid('getSelections');
					if(rows.length ==1){
						//修改时、取消密码一栏的可编辑状态
						$('#datagrid').datagrid('removeEditor', 'passWord');
						
						if(editRow != undefined){
							$('#datagrid').datagrid('endEdit', editRow);
						}
						if(editRow == undefined){
							var rowIndex = $('#datagrid').datagrid('getRowIndex',rows[0]);
							$('#datagrid').datagrid('beginEdit',rowIndex);
							editRow = rowIndex;
							$('#datagrid').datagrid('unselectAll');
						}
					}else if( rows.length == 0){
						$.messager.alert('提示', '请选择一条修改记录!','info');
					}else if(rows.length >= 1){
						$.messager.alert('提示', '只能选择一条修改记录!','info');
					}
				}
			}, '-',{
				text : '保存',
				iconCls : 'icon-save',
				handler : function() {
					$('#datagrid').datagrid('endEdit', editRow);
				}
			}, '-',{
				text : '取消编辑',
				iconCls : 'icon-redo',
				handler : function() {
					//将事务回滚、取消选中的行
					editRow = undefined;
					$('#datagrid').datagrid('rejectChanges');
					$('#datagrid').datagrid('unselectAll');
				}
			}, '-' ],
			onAfterEdit : function(rowIndex, rowData, changes){
				console.info(rowData);
				//使用ajax提交、在success中处理、如果添加成功
				/*
					1、添加成功
					editRow = undefined;
					2、添加不成功
					$('#datagrid').datagrid('beginEdit', rowIndex);
				*/
				
				//假设添加成功 
				editRow = undefined;
				
			},
			//双击修改行
			onDblClickRow : function(rowIndex, rowData){
				$('#datagrid').datagrid('unselectAll');
				if(editRow != undefined){
					$('#datagrid').datagrid('endEdit', editRow);
				}
				if(editRow == undefined){
					$('#datagrid').datagrid('removeEditor', 'passWord');
					$('#datagrid').datagrid('beginEdit',rowIndex);
					editRow = rowIndex;
				}
			}
		});
	});

	//查询数据
	function show() {
		$('#datagrid').datagrid('load', serializeObject($('#searchForm')));
	}

	//清除查询条件、返回初始数据展示状态
	function clean() {
		$('#datagrid').datagrid('load', {});
		$('#searchForm').find('input').val('');
	}
</script>

<div class="easyui-layout" data-options="fit:true,border:false,">
	<div data-options="region:'north',border:false,title:'过滤'"
		style="height: 140px;overflow: hidden">
		<form id="searchForm">
			<table class="datagrid-toolbar" style="height:100%;width:100%">
				<tr>
					<th>用户名</th>
					<td><input id="username" name="username" style="width: 320px" />
					</td>
				</tr>
				<tr>
					<th>创建时间</th>
					<td><input name="createTimeStart" editable="false"
						class="easyui-datetimebox" style="width:155px;" /> 至 <input
						name="createTimeEnd" editable="false" class="easyui-datetimebox"
						style="width:155px;" /></td>
				</tr>
				<tr>
					<th>修改时间</th>
					<td><input name="modifyTimeStart" editable="false"
						class="easyui-datetimebox" style="width:155px;" /> 至 <input
						name="modifyTimeEnd" editable="false" class="easyui-datetimebox"
						style="width:155px;" /> <a class="easyui-linkbutton"
						οnclick="show();">查询</a> <a class="easyui-linkbutton"
						οnclick="clean();">清空</a></td>
				</tr>
			</table>
		</form>

	</div>

	<div data-options="region:'center',border:false">
		<table id="datagrid"></table>
	</div>

</div>

        3、LoginAction——getJson():

	public String getJson() throws IOException{
		List<UserDTO> userList = new ArrayList<UserDTO>();
		userList.add(new UserDTO("1","chy","123",getCurrentTime(),getCurrentTime()));
		userList.add(new UserDTO("2","mxx","123",getCurrentTime(),getCurrentTime()));
		userList.add(new UserDTO("3","chk","123",getCurrentTime(),getCurrentTime()));
		if("chy".equals(username)){
			userList.add(new UserDTO("4","chy","123",getCurrentTime(),getCurrentTime()));
		}
		//当与后台交互时、可以根据前台回传的页号与每页记录数查询数据
		//List<UserDTO> userList = userService.getUsers(page, rows); 这样就可以动态获取每页记录数、前台动态展示。
		//但是现在前台的总页数却变成每页的记录数、这样就要求还要有个service查询总记录数、然后重新构造Json传回到前台
		//int count = userService.getUersCount();
		
		/*
		 * 想要按照某个列进行排序的时候、就使用前台传过来的关于排序的字段和排序方式 sort、order
		 * List<UserDTO> userList = userService.getUsers(page, rows, sort, order) 
		 */
		System.out.println("sort" + sort + " order" + order);
		
		Map<String, Object> m = new HashMap<String, Object>();
		m.put("total", 12);
		m.put("rows", userList);
		
		
		System.out.println(getJson(m));
		
		PrintWriter pw  = ServletActionContext.getResponse().getWriter();
		pw.write(getJson(m));
		pw.flush();
		pw.close();
		return null;
	}

	private String getCurrentTime(){
		SimpleDateFormat   sDateFormat   =   new   SimpleDateFormat("yyyy-MM-dd hh:mm:ss");   
		return  sDateFormat.format(new   java.util.Date()); 
		
	}
	
	private String getJson(Object o) throws IOException,
			JsonGenerationException, JsonMappingException {
		ObjectMapper om = new ObjectMapper();
		StringWriter sw = new StringWriter();
		JsonGenerator jg = new JsonFactory().createJsonGenerator(sw);
		om.writeValue(jg, o);
		jg.close();
		return sw.toString();
	}

        4、UserDTO:


package com.chy.ssh.business.bean;

import java.io.Serializable;

@SuppressWarnings("serial")
public class UserDTO implements Serializable{
	private String id;
	private String userName;
	private String passWord;
	private String createTime;
	private String updateTime;
	
	
	public UserDTO() {
		super();
	}
	
	
	public UserDTO(String id, String userName, String passWord,
			String createTime, String updateTime) {
		super();
		this.id = id;
		this.userName = userName;
		this.passWord = passWord;
		this.createTime = createTime;
		this.updateTime = updateTime;
	}


	public String getCreateTime() {
		return createTime;
	}
	public void setCreateTime(String createTime) {
		this.createTime = createTime;
	}
	public String getUpdateTime() {
		return updateTime;
	}
	public void setUpdateTime(String updateTime) {
		this.updateTime = updateTime;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassWord() {
		return passWord;
	}
	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	
}

        5、chyUtils.js:


/**
 * 动态的选择处于修改状态的行中的某些列是否可编辑
 */
$.extend($.fn.datagrid.methods, {
	addEditor : function(jq, param){
		if(param instanceof Array){
			$.each(param, function(index, item){
				var e = $(jq).datagrid('getColumnOption', item.field);
				e.editor = item.editor;
			});
		} else {
			var e = $(jq).datagrid('getColumnOption', param.field);
			e.editor = param.editor;
		}
	},
	removeEditor : function(jq, param){
		if(param instanceof Array){
			$.each(param, function(index, item){
				var e = $(jq).datagrid('getColumnOption', item);
				e.editor = {};
			});
		} else {
			var e = $(jq).datagrid('getColumnOption', param);
			e.editor = {};
		}
	}
});
 

四:补充说明


    代码贴的比较多、这样看起来会有头有尾一点、以后用可以直接copy。。。没有与后台交互、但是这里不是重点、页面写好、后台就视个人而定了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值