一:简介
在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"%> <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> <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>门户 </li> <li>用户管理</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>
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%"> <tbody><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;"> 查询 清空</td> </tr> </tbody></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(); }</string,></string,></userdto></userdto></userdto></userdto>
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。。。没有与后台交互、但是这里不是重点、页面写好、后台就视个人而定了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2010-01-18 [设计模式整理笔记 八] 单例模式(Singleton)
2010-01-18 [设计模式整理笔记 七] 原型模式(ProtoType)