datatables合并行(带分页、筛选)

由于项目的需要,datatables表格需要对一些相同的数据单元进行行合并,但是网上搜索了半天,能实现行的合并,但是在经过数据筛选或者分页后又会还原。在此记录下自己的解决办法,希望能帮到需要的人。。。

1、合并原理

在datatables中,对于行的合并好像并没有给出具体的api,这里行的合并都是通过rowspan来实现,所以要合并多少行,这里需奥数据来标明。所以我做sql查询的时候,把数据进行了分组,然后给出一个字段来表示需要设置rowsapn的值,根据此值来添加相应的rowspan属性,从而实现合并行。

2、具体实现

1、查询的数据格式

在查询出来的数据中,有ROWN和MAXNUM两列,ROWN表示组内的顺序,MAXNUM表示组内最大的ROW值。

2、JS代码

网上的合并行都是将合并代码写在createdCell 当中,但是在对表格进行重绘后就会产生还原的问题,所以在下面的代码中我仅仅是把代码写到rowCallback 中而已,具体代码看下面:

首先在这里封装了一个datatables的方法:

var $table;
/**
 * 初始化Datatablas 包含分页,单列排序
 * @param {any} url 请求路径
 * @param {any} columns 列初始化
 * @param {any} columnDefs 自定义列显示
 */
function initTable(url, columns, columnDefs, loadSuccess, rowCallBack) {
    $table = $('#data-table').DataTable({
        "language": {
            "url": _datatablesLangUrl //全局变量,定义在_layout中
        },
        "dom": _defaultDom,
        "ordering": true,
        //"lengthChange": false, //是否允许用户改变表格每页显示的记录数,false时隐藏,默认true
        'order': [],//初始排序列
        //'select': true,
        "processing": true,
        "serverSide": true,
        "pageLength": 25,
        "scrollX": true,
        "scrollY": '50vh',
        "scrollCollapse": true,
        "destroy": true,
        "ajax": {
            "url": url,
            "type": "POST"
        },
        "rowCallback": function (row, data, index) {
            //console.log(data);
            if (rowCallBack)
                rowCallBack(row, data, index);
        },
        "columns": columns,
        "columnDefs": columnDefs
    });
    $table.on('init.dt', function () {
        if (loadSuccess)
            loadSuccess();
    })
}

 

loadSuccess和rowCallBack都是回调方法。

 var columns = [
                {"title":"", data: null, "visible": true },
                {"title":"",  data: null, "visible": true },
                {"title":"",  "width": "30px", "data": null },// 序号列
                {"title":"",  "data": "ID", "visible": false },
                {"title":"EXPRESSNUMBER",  "data": "EXPRESSNUMBER" },
                {"title":"EXPRESSCOMPANY",  "data": "EXPRESSCOMPANY" },
                {"title":"INVOICENO",  "data": "INVOICENO" },//6
                {"title":"CUSTOMERCODE",  "data": "CUSTOMERCODE" },
                {"title":"CUSTOMERFULLNAME",  "data": "CUSTOMERFULLNAME" },
                {"title":"CREATEUSERNAME",  "data": "CREATEUSERNAME", orderable: !1 },
                {"title":"CREATETIME",  "data": "CREATETIME", orderable: !1 },
                {"title":"LOGUSERNAME",  "data": "LOGUSERNAME", orderable: !1 },
                {"title":"LOGTIME",  "data": "LOGTIME", orderable: !1 },
                {"title":"EXPRESSENCODINGID",  "data":"EXPRESSENCODINGID","visible":false},
                {"title":"rown",  "data":"rown","visible":false},
                {"title":"maxnum",  "data":"maxnum","visible":false},
            ];

 

var columnDefs = [{
                targets: 0, 
                orderable: !1,
                render: function (data, type, row, meta) {
                   //在列渲染时做的一些额外操作,比如颜色字体等等
                },
                {
                },
                ...........
            }

上面都是为表格初始化做的一些列定义等操作,网上搜索有详细的教程,下面就是行合并了,代码就是在rowCallBack当中:

function rowCallBack(row, data, index){
                //row代表表格的每一行,每行数据都会进入这个方法走一遍
                console.log(data)//data,就是当前行的数据
                if(data.rown == data.maxnum){
                    $(row).find("td").eq(3).attr('rowspan', data.maxnum);
                    $(row).find("td").eq(4).attr('rowspan', data.maxnum);
                }else{
                    $(row).find("td").eq(3).remove();
                    $(row).find("td").eq(3).remove();
                }
            }

在这个rowCallBack当中,我对数据进行了判断,就是将rown和maxnum相等的行合并,不相等的删除掉。当然这里的操作,得看自己的数据格式,如果对于数据库查询出来的数据,每一组内的rown并不是从大到小的,而是从小到达的,你也可以判断data.rown == 1的时候进行行合并 ,其他条件下进行单元格的删除。 上面代码中eq(n)这个值由自己决定合并哪一列(从左到右 数起,其实为0),这里解释下上面代码中为什么会对eq(3)进行两次remove(),这是因为在第一次对eq(3)进行remove操作后,本来的....eq(4).remove(),由于前一列被删除,这里的第4列就变成列第3列,所以第二次对eq(3)的remove就是对eq(4)的remove()。

对于上面sql查询出来的数据格式,主要是用了Oracle的partition by分析函数,下面简单介绍下原理:

 对于数据表的数据,我分为三个步骤得到上面的数据格式:

1、第一次,使用partition by分析函数分组:

select row_number() over(partition by t.expressnumber order by t.createtime desc) rown ,t.* from temp t

上面的sql可以得到一个分组的数据,也就得到了需要用到的 rown

2、

SELECT MAX(tt.rown) maxnum,tt.expressnumber from t2 tt group by tt.expressnumber

这里的t2表就是第一步查询得出的结果集,这个可以使用Oracle的with实现

3、对上面的两个结果集进行left join

with t2 as --第一步
(
   select row_number() over(partition by t.expressnumber order by t.logtime desc) rown ,t.* from temp t
),
t3 as --第二步
(
  SELECT MAX(tt.rown) maxnum,tt.expressnumber from t2 tt group by tt.expressnumber
)
--第三步
select tt2.*,tt3.maxnum from t2  tt2
left join  t3 tt3
on tt2.expressnumber = tt3.expressnumber 

上面的代码基本就能得到数据,如果发现组内顺序或者组外顺序不尽人意,进行下组外组内排序就能得到数据了。

 

上面只是我自己的一些见解,请大家批评指正。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 你可以通过以下两种方式来设置DataTables大量分页: 1. 通过设置每页显示的记录条数来减少分页数。可以通过设置每页显示的记录条数,比如每页显示50条记录,来减少分页数。这样可以减少服务器端的负载,并提高页面加载速度。 2. 通过使用服务器端分页来实现。服务器端分页是将数据库中的所有记录一次性获取并存储在服务器内存中,然后根据需要分页显示记录。这样可以避免前端页面与服务器端的多次通信,降低服务器端的负载,提高页面加载速度。 请注意,以上两种方式需要根据实际的业务需求和数据量进选择。如果数据量很大或者涉及到多表关联查询,那么使用服务器端分页会更加合适。如果数据量比较小,且分页查询比较频繁,那么就可以考虑使用前端分页。 ### 回答2: DataTables是一个常用的数据表格插件,用于在网页上展示和处理大量数据。要设置DataTables的大量分页,可以按照以下步骤进: 1. 导入DataTables插件:在网页中引入DataTables的相关文件,包括CSS和JavaScript文件。 2. 创建一个HTML表格:在网页中创建一个HTML表格,用于展示数据。 3. 初始化DataTables:使用JavaScript代码初始化DataTables插件,并关联到HTML表格上。可以指定一些参数来配置DataTables为,比如分页大小、排序方式等。 4. 加载数据:根据需要,可以使用Ajax或其他方式加载大量的数据,并填充到HTML表格中。 5. 分页设置:根据需要,可以设置DataTables的分页大小和显示页码的数量。分页大小定义了每页显示的数据条数,而显示页码的数量决定了页面下方的页码导航栏上可见的页码数量。 6. 自定义分页样式:可以自定义CSS样式来美化分页导航栏,使其更符合网页的设计风格。 7. 配置分页回调函数:DataTables提供了一些回调函数,可以在分页事件发生时执自定义的处理逻辑。例如,可以在翻页时重新加载新的数据。 通过以上步骤,我们可以设置DataTables插件以处理大量数据的分页展示需求。根据具体的情况,可以根据DataTables提供的参数和回调函数进更高级的设置和定制。 ### 回答3: DataTables是一个用于处理大量数据的JavaScript插件,它提供了丰富的功能和选项来进数据分页。下面是一些设置DataTables大量分页的方法: 1. 分页器设置:使用`paging`选项来设置分页器的样式和显示。可以设置每页显示的记录数量,以及是否显示分页器。例如,通过将`paging: true`设置为`paging: false`,可以禁用分页器。 2. 分页模式设置:使用`pagingType`选项来设置分页模式。DataTables提供了多种分页模式,如简单数字导航、多页块以及滚动分页等。选择合适的分页模式可以提升用户体验。 3. AJAX分页:对于大量数据,可以使用Ajax加载数据,并通过`serverSide`选项将分页交由服务器处理。这样可以避免一次性加载大量数据,提高分页的性能和响应速度。 4. 自定义分页按钮:使用`pagingNumbers`选项可以自定义分页按钮的显示。你可以通过修改分页按钮模板来更改其样式或添加自定义的元素。 5. 页码跳转:可以使用`pagingType`选项的`input`值来在分页器中添加页码跳转输入框。用户可以在输入框中输入页码,然后按下回车键或单击跳转按钮来跳转到指定页。 6. 分页事件:DataTables提供了多个分页相关的事件,如`page`和`length`事件。你可以通过监听这些事件来执自定义操作,如加载其他数据、更新页面元素等。 总的来说,要设置DataTables大量分页,需要根据具体的需求和情况来选择适当的配置选项,并可以利用其提供的丰富功能和事件来进自定义操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值