用easyui做datagrid表格

关于easyui,之前只是听说过了解一点点,到这边上班之后发现他们用的极多,然后作为新人被安排的一些简单的任务里也有用到它的。没办法,硬着头皮上吧,一边对着官网上的demo,一边对着手册,一边摸索着做呗。首先看效果图

相关代码如下(只摘的部分供参考,不能运行的):

 $(‘#tt‘).datagrid({
                nowrap: false,
                striped: true,
                remoteSort: false,
                singleSelect: true,
                fitColumns: true,
                pageSize: 25,
                pageList: [25, 35, 45, 55],
                title: "商家信息",
                toolbar: ‘#toors‘,
                loadMsg: ‘加载中...‘,
                //                onDblClickRow: function (rowIndex, rowData) {

                //                    getsub(rowIndex, rowData, callback);
                //                    var ExpandRow = $("#ExpandRow").val();
                //                    if (ExpandRow != ‘‘) {
                //                        $(‘#tt‘).datagrid("expandRow", ExpandRow);
                //                    }
                //                    $("#ExpandRow").val(rowIndex); ;
                //                },
                url: ‘../ashx/SellerManager.ashx?type=GetSellerList&se_property=0‘,
                columns: [[
                { field: ‘SE_NAME‘, title: ‘商家名称‘, width: $(this).width() * 0.13, formatter: function (value, row, index) {
                    return "<a href=‘http://seller.jukelai.cn/AStation/?suname=" + row.USERNAME + "&supwd=" + row.UPASSWORD + "‘ target=‘_blank‘>" + row.SE_NAME + "</a>";
                }
                },
                { field: ‘USERNAME‘, title: ‘用户名‘, width: $(this).width() * 0.1 },
                { field: ‘SE_TYPE‘, title: ‘商家类型‘, width: $(this).width() * 0.1 },
                { field: ‘PROVINCES‘, title: ‘所在地‘, width: $(this).width() * 0.1, formatter: function (value, row, index) {
                    return row.PROVINCES + ‘-‘ + row.CITY + "-" + row.COUNTY;
                }
                },
                { field: ‘SE_CONTACT‘, title: ‘联系人‘, width: $(this).width() * 0.1 },
                { field: ‘SE_PHONE‘, title: ‘联系电话‘, width: $(this).width() * 0.1 },
                { field: ‘SE_EQUIPMENTCOUNT‘, title: ‘设备数量‘, width: $(this).width() * 0.1 },
                { field: ‘SE_URL‘, title: ‘网址‘, width: $(this).width() * 0.1 },
                { field: ‘SE_BUSINESSAREA‘, title: ‘营业面积‘, width: $(this).width() * 0.1 },
                { field: ‘SE_PROPERTY‘, title: ‘性质‘, width: $(this).width() * 0.1, formatter: function (value, row, index) {

                    if (row.SE_PROPERTY == 0) {
                        return ‘总店‘;
                    }
                    else {
                        return ‘分店‘;
                    }
                }
                }
                ]],
                onClickRow: function (rowIndex, rowData) {
                    if (childbody != null) {
                        childbody.datagrid(‘unselectAll‘);
                    }
                },
                pagination: true,
                onLoadSuccess: function (data) {
                    if (data.total == 0) {
                        console.info(‘进入无数据‘);
                        var body = $(this).data().datagrid.dc.body2;
                        console.info("body:%f", body);
                        body.find(‘table tbody‘).append(‘<tr><td width="‘ + body.width() + ‘" style="height: 25px; text-align: center; color:Red">抱歉,没有查询到数据</td></tr>‘);
                    }
                }
            });
            var ExpandRow = null;
            $(‘#tt‘).datagrid({
                view: detailview,
                detailFormatter: function (index, row) {
                    return ‘<div style="padding:3px" id="ddv-"‘ + index + ‘><table class="ddv"></table></div>‘;
                },
                onExpandRow: function (index, row) {

                    getsub(index, row, callback);
                    collapserow(index);

                    //$(‘#tt‘).datagrid(‘reload‘);
                }
            });
            function collapserow(index) {
                ExpandRow = $("#ExpandRow").val();
                if (ExpandRow != ‘‘ && ExpandRow != index) {
                    $(‘#tt‘).datagrid("collapseRow", ExpandRow);
                }
                if (ExpandRow == index) {
                    $(‘#tt‘).datagrid("expandRow", index);
                }
                $("#ExpandRow").val(index);
            }

            function callback(gridbody) { //拿到子级对象
                if (gridbody != null) {
                    childbody = gridbody;
                }
            }

            function getsub(index, row, callback) {
                ddv = $(‘#tt‘).datagrid(‘getRowDetail‘, index).find(‘table.ddv‘);
                var tt = $(‘#tt‘);
                var cc = row.SE_ID;
                ddv.datagrid({
                    url: ‘../ashx/SellerManager.ashx?type=GetSellerList&se_property=1&se_parentid=‘ + cc,
                    nowrap: false,
                    striped: true,
                    remoteSort: false,
                    singleSelect: true,
                    fitColumns: true,
                    singleSelect: true,
                    rownumbers: true,
                    loadMsg: ‘加载中...‘,
                    height: ‘auto‘,

                    onClickRow: function (rowIndex, rowData) {
                        $(‘#tt‘).datagrid(‘unselectAll‘);
                        ddv.datagrid(‘unselectAll‘);
                        $(this).datagrid(‘selectRow‘, rowIndex);
                    },
                    columns: [[
                        { field: ‘SE_NAME‘, title: ‘商家名称‘, formatter: function (value, row, index) {
                            return "<a href=‘http://seller.jukelai.cn/AStation/?suname=" + row.USERNAME + "&supwd=" + row.UPASSWORD + "‘ target=‘_blank‘>" + row.SE_NAME + "</a>";
                        }
                        },
                        { field: ‘USERNAME‘, title: ‘用户名‘ },
                        { field: ‘SE_TYPE‘, title: ‘商家类型‘ },
                        { field: ‘PROVINCES‘, title: ‘所在地‘, formatter: function (value, row, index) {
                            return row.PROVINCES + ‘-‘ + row.CITY + "-" + row.COUNTY;
                        }
                        },
                        { field: ‘SE_CONTACT‘, title: ‘联系人‘ },
                        { field: ‘SE_PHONE‘, title: ‘联系电话‘ },
                        { field: ‘SE_EQUIPMENTCOUNT‘, title: ‘设备数量‘ },
                        { field: ‘SE_URL‘, title: ‘网址‘ },
                        { field: ‘SE_BUSINESSAREA‘, title: ‘营业面积‘ },
                        { field: ‘SE_PROPERTY‘, title: ‘性质‘, formatter: function (value, row, index) {

                            if (row.SE_PROPERTY == 0) {
                                return ‘总店‘;
                            }
                            else {
                                return ‘分店‘;
                            }
                        }
                        }
                        ]],
                    onResize: function () {
                        $(‘#tt‘).datagrid(‘fixDetailRowHeight‘, index);
                    },
                    onLoadSuccess: function (data) {
                        setTimeout(function () {
                            $(‘#tt‘).datagrid(‘fixDetailRowHeight‘, index);
                        }, 0);

                        if (data.total == 0) {
                            //console.info(‘进入无数据‘);
                            var body = $(this).data().datagrid.dc.body2;
                            //console.info("body:%f", body);
                            body.find(‘table tbody‘).append(‘<tr><td width="‘ + body.width() + ‘" style="height: 25px; text-align: center; color:Red">抱歉,没有查询到数据</td></tr>‘);
                        }

                    }
                });
                callback(ddv);
            }

需注意的地方:

1,子层是异步加载的,在子层加载的时候,第一次点击展开一个表的时候会把下面的内容挤下去,第二次点开的时候就好了。如图:

解决办法:在异步加载的onLoadSuccess里加 上下面几行代码就可以了,如果不写settimeout,直接写函数里面的那一行代码却不行,到最后也没搞明白为什么要这样写,如果有谁懂的,请赐教。

setTimeout(function () {
         $(‘#tt‘).datagrid(‘fixDetailRowHeight‘, index);
}, 0);

2,需求是不管是父层还是子层,每次只能选中一条信息,但是实际操作中发现父层和子层可以同时选中,这样的话对数据的操作(编辑、删除)就容易混淆,因为同时选中很多条,你就不知道当你点了删除按钮它会删除哪一条。

解决办法:在两层表格中都加上一个点击行事件(onClickRow),在点击父层的时候让子层的状态改为‘unselectAll’,即取消选择所有行。如图:

3,在2的基础上发现另外一个问题,在父层点击行的时候会报错,提示对象为null,但是alert时却是object,研究了很长时间都找不到答案,最后请教了我的老师,他的一句话让我茅塞顿开。他说:要在回调函数里去拿第二层,也就是要异步的回来之后再调用一个函数去拿,否则代码立即执行,异步的还没有回来当然是空了,alert是停顿的,所以不是null 。

解决办法:定义一个全局变量,然后写一个回调函数,在异步加载的时候把对象传到回调函数里,再赋值给那个全局变量

这里getsub这个函数是异步加载第二层的那一块,我把它抽出来做成一个函数了,callback就是那个回调函数,gridbody是getsub里拿到的第二层的对象,childbody是全局变量,这样在父层里直接用childbody就可以控制子层了。

4,想把它做成展开一行的时候其余的都折叠的效果,百度了一下,发现有大神给出如下代码:  

$("#ExpandRow")是一个隐藏域,用来记录你上一次展开的那一行的ID,但是这样写有一个漏洞,就是当你展开一次之后关闭,然后再点就展不开了。因为这段代码里是把当前行的状态改为‘collapseRow’,也就是折叠,当你再点的时候它的状态还是折叠,所以就展不开了。

解决办法:研究了一下,发现将这段代码稍稍改造一下就可以了。如下代码,又加了一个判断,如果点击的仍是当前行,就把该行的状态改为展开,OK了。

这是本人第一次用博客记录自己在工作中的学习心得,方便自己也方便大家,如果有疑问可留言讨论。

时间: 2024-10-08 13:23:46

用easyui做datagrid表格的相关文章

ASP.NET MVC5+EF6+EasyUI 后台管理系统(92)-打印EasyUI 的datagrid表格

前言 应用系统有时候需要打印Datagrid的表格内容,我们本节就来学习打印datagrid内容 打印主要使用:web打印(我们之前有讲过web打印插件jqprint) + 将datagrid重新编制成可以打印的html格式 一.建立一个普通的例子 我们使用官方下载的demo下的datagrid basic.html代码就好 引入Jqgrid打印插件,并增加一个按钮来触发打印事件 <!DOCTYPE html> <html> <head> <meta charse

jQuery easyUI 使用 datagrid 表格

获取后台数据依旧是使用一般处理程序(ashx) ,分页上添加一个函数(pagerFilter(data)) 前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="dataGrid.aspx.cs" Inherits="Web.Management.dataGrid" %> <!DOCTYPE html> <html xmln

[原创]关于easyui下datagrid表格控件分页控制(非url方式)

先看效果 其实如果用url回传方式来加载数据的话前端几乎不需要设置什么,只需要把分页选项打开即可,然后后端服务器再组织每个页面的内容送到前端即可. 但是我们的项目是一次性先把数据全部传输到前端了,用data属性方式而不是url回传方式来加载的数据,所以就要在前端对数据进行处理加工了. var mainJson = arr[0];//后端传到前端的所有数据的Json字符串 $("#dg").datagrid({ data: GetDataByPage(mainJson, 1, 10),

IE浏览器下easyui的datagrid无法显示和列显示不齐解决方案

如遇到IE无法显示easyui的datagrid表格其他浏览器显示正常,可以先检查一下js代码是否有多出的逗号,因为IE是非常的严格的,一个逗号都可能导致程序无法运行. 在IE执行AJAX增加修改方法时,弹出下载框,可在Controller中规定一下格式 @RequestMapping(value="/addxxx",produces = {"text/html;charset=UTF-8"}),问题得到解决 还有IE浏览表格错位,这个问题让我非常的头疼,找了很多的

如何用easyui+JAVA 实现动态拼凑datagrid表格(续)

前面一段时间写了一篇文章: 如何用easyui+JAVA 实现动态拼凑datagrid表格 这篇文章的话,效果是可以实现,但是经过我反复试验,还是存在一些问题的. 今天这篇文章就是向大家介绍下如何避免和解决这些问题. 问题如下: 这个TEMP值其实就是上面文章提到的z1,z2,z3,z4的值,也就是说,每次进行each循环,都会查出不同的值,并返回,但是事实并不是这样的 这个TEMP返回的是EACH循环以后的最后一次的值. 记住,EACH循环本身就是一个封闭的,不会循环一次返回一个值,而是让前面

Easy-ui Datagrid表格数据的编辑与提交

前言 jQuery EasyUI是一组基于jQuery的UI 插件集合体,而jQuery EasyUI可以打造出功能更加丰富且美观的UI界面.开发者不需要了解复杂的javascript和css样式,只需要了解html标签. 一.    easy-ui基本知识 1.            easy-ui引用js顺序详解 引用Jquery的js文件: <script src="jquery-easyui-1.3.4/jquery-1.8.0.min.js" type="te

easyUI——datagrid表格批量操作

对datagrid表格进行批量的操作,是每个系统都会遇到的,通过一下小实例总结一下.其实 原理很简单:获取选中的数据的主键,传值到后台,对数据进行操作. HTML <table id="dg" title="My Users" class="easyui-datagrid" style="width:700px;height:250px" url="GetUserData" toolbar="

在EasyUI的DataGrid中嵌入Combobox

在做项目时,需要在EasyUI的DataGrid中嵌入Combobox,花了好几天功夫,在大家的帮助下,终于看到了它的庐山真面: 核心代码如下: <html> <head> @*添加Jquery EasyUI的样式*@ <link href="@Url.Content("../../Content/JqueryEasyUI/themes/default/easyui.css")" rel="stylesheet" /

easyui使用datagrid时列名包含特殊字符导致表头与数据错位的问题

做一个用easyui的datagrid显示数据的功能时发现表格的列头与数据错位了,而且这个现象不总是能重现,一直没搞清楚原因.后来偶然在控制台看出了一点端倪: 推测表头或者单元格的class名应该是用字段名拼出来的,如果含有特殊字符可能违反了css的命名规则(权威的css命名规则暂时没有找到,这篇文章稍有提到). 我找了个有特殊字符的列的数据,发现果然歪了.验证了想法. 由于项目的特殊性,数据库的表是动态创建的,也就是部分列名是由用户输入的,比较随意(当然,列头是另外是有显示名称的). 所以这个