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"%>
 
 
   
     
    <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="160px;"></div>
        <div data-options="region:'west',title:'功能导航',split:true" style="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%;100%">
                <tbody><tr>
                    <th>用户名</th>
                    <td><input id="username" name="username" style=" 320px">
                    </td>
                </tr>
                <tr>
                    <th>创建时间</th>
                    <td><input name="createTimeStart" editable="false" class="easyui-datetimebox" style="155px;"> 至 <input name="createTimeEnd" editable="false" class="easyui-datetimebox" style="155px;"></td>
                </tr>
                <tr>
                    <th>修改时间</th>
                    <td><input name="modifyTimeStart" editable="false" class="easyui-datetimebox" style="155px;"> 至 <input name="modifyTimeEnd" editable="false" class="easyui-datetimebox" style="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。。。没有与后台交互、但是这里不是重点、页面写好、后台就视个人而定了。 

原文地址:https://www.cnblogs.com/whtydn/p/5138734.html