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日

相关文章

  • 最大限度的分离table的样式与结构

    实现最大限度的分离table的样式与结构可以有以下几个步骤: 使用CSS选择器对表格进行样式控制 为实现样式与结构的分离,应尽量将表格的样式与HTML文档分开,可在CSS文件中对表格的样式进行控制,而不要使用内联样式或为表格添加style属性。可使用CSS选择器对表格进行样式控制,如下所示: /* 对表格的标题行、表头单元格、表格单元格和表格边框进行样式控制…

    css 2023年6月9日
    00
  • CSS的position属性完全解析

    CSS的position属性完全解析 什么是position属性? position是CSS中用来设置元素定位方式的属性,它有五种取值分别是: static relative absolute fixed sticky static static是position属性的默认值,元素不受top, right, bottom, left or z-index影响…

    css 2023年6月9日
    00
  • 纯css3使用vw和vh实现自适应的方法

    下面我将详细讲解“纯CSS3使用vw和vh实现自适应的方法”的完整攻略。 1. 什么是vw和vh vw和vh是CSS3新增的单位,它们分别表示相对于视窗(Viewport)宽度的1/100和高度的1/100。 其中,Viewport指网页中能够显示内容的区域,包括浏览器窗口和可滚动的区域。 通过使用vw和vh,我们可以直接利用浏览器窗口的宽度和高度计算元素的…

    css 2023年6月10日
    00
  • Community Server专题三:HttpModule

    让我来详细讲解一下“Community Server专题三:HttpModule”的完整攻略。 标题 1. 什么是HttpModule? HTTP模块(HttpModule)是用于扩展 ASP.NET Web 应用程序处理请求管道的一个组件。通过使用HTTP模块,您可以在请求处理期间介入请求管道,并检查或修改进入的请求、出站的响应或双方。HttpModule…

    css 2023年6月10日
    00
  • 第一次接触神奇的Bootstrap

    Bootstrap是一种用于创建响应式、移动设备优先的Web应用程序的强大框架。对于新手来说,初次接触Bootstrap可能会感到有些挑战,但只要您按照以下步骤操作,就可以在不到几个小时内学会使用Bootstrap。 步骤一:准备工作 在开始学习Bootstrap之前,您需要执行以下准备工作:1. 确定您的开发环境:您需要一个文本编辑器,一个Web服务器和一…

    css 2023年6月9日
    00
  • 纯CSS3实现扇形动画菜单(简化版)实例源码

    让我来为您详细讲解“纯CSS3实现扇形动画菜单(简化版)实例源码”的完整攻略。 简介 本文将介绍如何使用纯 CSS3 实现一个扇形动画菜单,该菜单由多个扇形按钮组成,点击其中一个按钮可以展开当前按钮菜单。 步骤 第一步:HTML 结构 首先,我们需要在 HTML 中定义菜单结构。示例代码如下: <div class="menu"&g…

    css 2023年6月9日
    00
  • BAT及各大互联网公司2014前端笔试面试题(Html,Css篇)

    BAT及各大互联网公司2014前端笔试面试题(Html,Css篇)是一份经典的前端笔试面试题目集,包含了许多常见的 HTML 和 CSS 技术问题。本文将提供一份完整攻略,包括题目解析、示例说明和代码实现。 题目解析 1. 如何实现一个三角形? 可以使用 CSS 的 border 属性来实现一个三角形。具体方法是将元素的宽度和高度设为 0,然后设置 bord…

    css 2023年5月18日
    00
  • JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解

    这里就为你详细讲解一下如何实现JS弹出浮动窗口,包括拖动和关闭功能。 准备工作 首先,我们需要在HTML文件里引入以下JS和CSS文件: <link rel="stylesheet" href="style.css"> <script src="https://cdn.bootcss.com…

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