EasyUI折叠表格层次显示detailview详解及实例

EasyUI折叠表格层次显示detailview详解及实例

介绍

在EasyUI中,可以使用折叠表格来显示分层数据。当需要在折叠的表格中显示更多详细的数据时,我们可以使用detailview来展示更多信息。

detailview可以根据EasyUI数据网格中的数据动态创建一个子网格,并在父网格中嵌入行中的图标上提供展开和收缩子网格的的链接。

教程

步骤 1: 引入必要的资源文件

为了使用EasyUI的折叠表格和detailview,我们需要引入相关的资源文件。可以通过CDN引入或者下载到本地并引入。

<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/easyui@1.9.22/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/easyui@1.9.22/themes/icon.css">
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/easyui@1.9.22/jquery.easyui.min.js"></script>

步骤 2: 创建 HTML 和 JavaScript 代码

在HTML中,我们需要添加一个EasyUI数据网格,同时为需要在detailview中显示的列添加formatter函数。

<table id="dg" class="easyui-datagrid" style="height:400px"
       url="datagrid_data1.json"
       title="DataGrid"
       toolbar="#toolbar"
       pagination="true"
       rownumbers="true"
       fitColumns="true"
       singleSelect="true">
    <thead>
        <tr>
            <th field="itemid" width="50">Item ID</th>
            <th field="productid" width="50">Product ID</th>
            <th field="listprice" width="50" formatter="priceFormatter">List Price</th>
            <th field="unitcost" width="50" formatter="priceFormatter">Unit Cost</th>
            <th field="attr1" width="100">Attribute</th>
            <th field="status" width="50" formatter="statusFormatter">Status</th>
        </tr>
    </thead>
</table>

在这个例子中,我们为List Price和Unit Cost这两列添加了formatter函数。这个函数将数值显示成货币的格式(例如: $1,000.00)。

为了添加detailview,我们需要在JavaScript代码中配置datagrid的options,并提供detailview的模板(即子表数据)。

$('#dg').datagrid({
    view: detailview,
    detailFormatter: function(index,row){
        return '<div style="padding:2px"><table class="ddv"></table></div>';
    },
    onExpandRow: function(index,row){
        var ddv = $(this).datagrid('getRowDetail',index).find('table.ddv');
        ddv.datagrid({
            url:'datagrid_data2.json',
            fitColumns:true,
            singleSelect:true,
            rownumbers:true,
            loadMsg:'',
            height:'auto',
            columns:[[
                {field:'orderid',title:'Order ID',width:100},
                {field:'shipname',title:'Name',width:100},
                {field:'shiptime',title:'Shipped Da',
                 width:150,align:'right'}
            ]],
            onResize:function(){
                $('#dg').datagrid('fixDetailRowHeight',index);
            },
            onLoadSuccess:function(){
                setTimeout(function(){
                    $('#dg').datagrid('fixDetailRowHeight',index);
                },0);
            }
        });
        $('#dg').datagrid('fixDetailRowHeight',index);
    }
});

在这个例子中,我们设置了onExpandRow事件来加载并显示子网格。(举个例子)当用户展开一个行时,数据从异步加载的datagrid_data2.json 文件中返回。另外,onResize和onLoadSuccess事件也被绑定到了子网格中。onResize事件确保子网格具有正确的大小,而onLoadSuccess事件确保网格在加载后立即正确显示。

步骤 3: 完整代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/easyui@1.9.22/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/easyui@1.9.22/themes/icon.css">
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/easyui@1.9.22/jquery.easyui.min.js"></script>
    <script type="text/javascript">
        var detailview = $.extend({}, $.fn.datagrid.defaults.view, {
            renderRow: function (target, fields, frozen, rowIndex, rowData) {
                var cc = [];
                cc.push('<tr class="datagrid-row-detail">');
                if (!frozen) {
                    cc.push('<td colspan="' + fields.length + '">');
                    cc.push('<div style="padding:5px 0;border-bottom:1px solid #ccc">');
                    cc.push('<table class="ddv"></table>');
                    cc.push('</div>');
                    cc.push('</td>');
                }
                cc.push('</tr>');
                return cc.join('');
            },
            onAfterRender: function (target) {
                $.fn.datagrid.defaults.view.onAfterRender.call(this, target);
                var opts = $(target).datagrid('options');
                if (!opts.addonBody) {
                    return;
                }
                if (opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length > 0)) {
                    return;
                }
                var tr = opts.finder.getTr(target, '', 'view', 2);
                var table = tr.parent().parent().parent();
                var tc = $('<td colspan="' + (opts.frozenColumns.length) + '"></td>').insertBefore(tr.children(':first'));
                var div = $('<div class="datagrid-view2-addon"></div>').html(opts.addonBody).appendTo(tc);
                setTimeout(function () {
                    div.triggerHandler('_resize');
                }, 0);
            },
            onBeforeRender: function (target) {
                var opts = $(target).datagrid('options');
                var vc = $(target).datagrid('getPanel').children('div.datagrid-view');
                opts.addonBody = null;
                if (opts.addonView && vc.children('style').length == 0) {
                    vc.prepend('<style>' + opts.addonView + '</style>');
                }
            },
            onDestroy: function () {
                var opts = $(this).datagrid('options');
                if (opts.addonView) {
                    var vc = $(this).datagrid('getPanel').children('div.datagrid-view');
                    vc.children('style').remove();
                }
            }
        });

        function priceFormatter(value,row,index){
            return '$' + value.toFixed(2);
        }

        function statusFormatter(value,row,index){
            if (value == 'P'){
                return '<span style="color:green">Processed</span>';
            } else if (value == 'D'){
                return '<span style="color:red">Discontinued</span>';
            }
            return value;
        }

        $(function(){
            $('#dg').datagrid({
                view: detailview,
                detailFormatter: function(index,row){
                    return '<div style="padding:2px"><table class="ddv"></table></div>';
                },
                onExpandRow: function(index,row){
                    var ddv = $(this).datagrid('getRowDetail',index).find('table.ddv');
                    ddv.datagrid({
                        url:'datagrid_data2.json',
                        fitColumns:true,
                        singleSelect:true,
                        rownumbers:true,
                        loadMsg:'',
                        height:'auto',
                        columns:[[
                            {field:'orderid',title:'Order ID',width:100},
                            {field:'shipname',title:'Name',width:100},
                            {field:'shiptime',title:'Shipped Da',width:150,align:'right'}
                        ]],
                        onResize:function(){
                            $('#dg').datagrid('fixDetailRowHeight',index);
                        },
                        onLoadSuccess:function(){
                            setTimeout(function(){
                                $('#dg').datagrid('fixDetailRowHeight',index);
                            },0);
                        }
                    });
                    $('#dg').datagrid('fixDetailRowHeight',index);
                }
            });
        });
    </script>
</head>
<body>
<div>
    <table id="dg" class="easyui-datagrid" style="height:400px"
           url="datagrid_data1.json"
           title="DataGrid"
           toolbar="#toolbar"
           pagination="true"
           rownumbers="true"
           fitColumns="true"
           singleSelect="true">
        <thead>
        <tr>
            <th field="itemid" width="50">Item ID</th>
            <th field="productid" width="50">Product ID</th>
            <th field="listprice" width="50" formatter="priceFormatter">List Price</th>
            <th field="unitcost" width="50" formatter="priceFormatter">Unit Cost</th>
            <th field="attr1" width="100">Attribute</th>
            <th field="status" width="50" formatter="statusFormatter">Status</th>
        </tr>
        </thead>
    </table>
</div>
</body>
</html>

这个例子将显示一个简单的datagrid,当用户点击一个行时,子网格将在该行下显示。子网格中将显示另一个数据文件 datagrid_data2.json 的内容,并且在每列的末尾都会显示一个详细信息链接。

步骤 4: 示例说明

我们代码的使用了两个例子:

  1. 在源码 example1.html 文件中,会通过 Ajax 方式从后端获取数据,并在 EasyUI 表格中展示出来,用户点击"+"展开折叠表格,然后展示子表格的详细信息。
  2. 在 example2.html 文件中,使用静态Json数据,在EasyUI 表格中展示带detailview的折叠表格,使用detailview来展示更多信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:EasyUI折叠表格层次显示detailview详解及实例 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript实现移动端横竖屏检测

    下面就给您讲解一下JavaScript实现移动端横竖屏检测的完整攻略: 步骤一:获取屏幕高宽 使用JS获取屏幕高宽的方式如下: var screenWidth = window.innerWidth; // 获取屏幕宽度,不包含滚动条 var screenHeight = window.innerHeight; // 获取屏幕高度,不包含地址栏 var sc…

    css 2023年6月9日
    00
  • Django前端BootCSS实现分页的方法

    下面我将为大家讲解如何使用Django和Bootstrap实现分页: 1. 引入Bootstrap 首先,我们需要在Django项目中引入Bootstrap框架。在base.html文件(或者其他你想要放置的文件)中添加以下代码: <!– 引入Bootstrap –> <link rel="stylesheet" h…

    css 2023年6月10日
    00
  • Vue运用transition实现过渡动画

    下面是“Vue运用transition实现过渡动画”的完整攻略。 一、transition基本概念 在Vue中使用<transition>组件可以优雅地实现过渡动画效果。<transition>组件是Vue内置的过渡动画组件。它可以在元素显示、隐藏、插入和删除时,根据设置的动画属性进行动画过渡。 <transition>组…

    css 2023年6月10日
    00
  • 使用jQuery实现的掷色子游戏动画效果

    使用jQuery实现掷色子游戏动画效果的攻略步骤如下: 1. 引入jQuery 在HTML文件head标签中引入jQuery文件。可以从官网下载(https://jquery.com/)或使用CDN。 <head> <script src="https://code.jquery.com/jquery-3.6.0.min.js&q…

    css 2023年6月11日
    00
  • CSS控制继承中的height能变为可继承吗

    CSS控制继承中的height属性默认不会被继承,因为height属性通常应用于块级元素,为其设置一个指定的高度值,并不会对其子元素产生影响,因此也不会被继承。 但是,我们可以通过一些技巧来使height属性变为可继承,示例如下: 第一种方法:使用百分比值 如果一个块级元素的高度值使用百分比来设置,那么其子元素的高度值也可以使用百分比来设置,并且继承自父元素…

    css 2023年6月10日
    00
  • js+css实现有立体感的按钮式文字竖排菜单效果

    以下是“js+css实现有立体感的按钮式文字竖排菜单效果”的攻略: 1. 确定布局 首先确定好页面布局,例如我们选择将菜单放置在左侧,右侧放置主体内容,同时考虑到菜单中每一个选项都是竖排文字,因此需要将菜单的宽度适当缩小,以腾出更多的空间在竖向上排列菜单选项。 我们可以使用flex布局将菜单容器设置为一个纵向排列的flex容器,并设置好宽高、边距和背景颜色等…

    css 2023年6月10日
    00
  • js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动

    下面我将详细讲解如何使用JavaScript实现遮罩层登录框和对联广告,并使其自动跟随滚动条滚动的完整攻略。 实现遮罩层登录框 制作遮罩层 制作遮罩层可以通过CSS中的 position 和 z-index 来实现,具体步骤如下: 1.将整个页面包含在一个父容器内,然后设置父容器为相对定位 position: relative。 .parent-contai…

    css 2023年6月10日
    00
  • JavaScript获取元素尺寸和大小操作总结

    JavaScript获取元素尺寸和大小操作总结 在Web开发中,获取元素的尺寸和大小是常见的需求。本文总结了JavaScript如何获取元素尺寸和大小的方法。 1. 基础方法 1.1 offsetWidth 和 offsetHeight offsetWidth 和 offsetHeight 属性是获取元素自身宽度和高度的方法,包括元素的边框、内边距和滚动条在…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部