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日

相关文章

  • jquery实现图片切换代码

    下面我将提供一个完整的jquery实现图片切换的攻略。 步骤一:HTML结构 首先需要创建一个HTML结构,例如: <div class="slideshow"> <img src="img1.jpg" alt="Image 1" class="active"&…

    css 2023年6月11日
    00
  • jquery如何改变html标签的样式(两种实现方法)

    想要使用 jQuery 改变 HTML 元素的样式,需要使用 css() 方法。这个方法可以帮助我们改变元素的内联样式,也可以修改嵌入样式表或外部样式表中的规则。总体来说,可以通过两种方式来改变 HTML 标签的样式。下面就详细介绍这两种实现方法。 一、使用 .css() 方法 使用 jQuery 的 .css() 方法可以轻松地改变 HTML 元素的样式。…

    css 2023年6月10日
    00
  • jQuery实现单击和鼠标感应事件

    下面是jQuery实现单击和鼠标感应事件的完整攻略: 1. jQuery基础 在使用jQuery之前,需要先引入jQuery库文件,可以在标签中添加以下代码: <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></scri…

    css 2023年6月10日
    00
  • CSS 学习心得

    CSS 学习心得 什么是 CSS? CSS(Cascading Style Sheets,层叠样式表)是一种用于定义网页内容样式和外观的语言。 CSS 的基本语法 CSS 的语法是由选择器和声明块组成的: 选择器 { 声明1; 声明2; … 声明N; } 其中,选择器用于选中要应用样式的 HTML 元素,声明块由一个或多个声明组成,每个声明由一个属性和一…

    css 2023年6月9日
    00
  • 使用 CSS3 中@media 实现网页自适应的示例代码

    下面我来详细讲解如何使用 CSS3 中@media 实现网页自适应的示例代码及其攻略。 什么是@media @media是CSS3中的一个规则,可以用于在不同的媒体条件下为不同的设备提供不同的样式。主要用来设置针对不同输出设备如屏幕、打印机等的不同样式。 通过@media规则,可以根据不同的设备来匹配不同的样式,因此可以使用它来实现网页自适应。 使用@med…

    css 2023年6月10日
    00
  • Vue指令的学习

    关于Vue指令学习的完整攻略,主要包含以下几个方面: 1、Vue指令的概念及分类 Vue指令的概念 Vue指令有时候也被称为“指令语法”,用于在模板中添加DOM元素属性或对元素进行逻辑控制。Vue.js内置了许多指令,也允许我们自定义指令。 Vue指令的分类 Vue指令大致可分为以下几类: 条件指令:如v-if、v-else、v-show等,用于控制DOM元…

    css 2023年6月9日
    00
  • 利用CSS3实现进度条的两种姿势详解

    关于“利用CSS3实现进度条的两种姿势详解”的攻略,我将会提供以下的详细步骤及示例说明来帮助读者更好地理解。 一、实现进度条的基本原理 实现进度条的基本原理是利用CSS3中提供的transition属性和transform属性来实现。transition属性决定了进度条过渡的时间、过渡方式以及过渡对象;而transform属性则可以使过渡对象发生缩放、旋转、…

    css 2023年6月11日
    00
  • 表格的头部固定效果通过css及jquery分别实现

    表格的头部固定效果是指当表格数据很多时,页面滚动时表头始终显示在页面顶部,便于查看数据。这个效果可以通过CSS和jQuery分别实现。 通过CSS实现表头固定效果 实现原理 通过CSS中的position: sticky与top属性实现,将表头固定在一定位置上,当表格区域滚动到一定位置时,表头就会被固定在页面顶部。 实现步骤 在CSS中定义表格头部样式 th…

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