Jquery DataTable跨行+子表

本来呢,只要做一个跨行就可以了~

但是呢,跑起来发现数据量特别大~

没有办法就只好加一个子表了

上图~~~这个是美化版本

 首先po上跨行table的代码

        //文档加载事件
        $(function () {
            //---------------------------初始化Datatable Begin--------------------------
            var oTable = $('#example').DataTable({
                "sDom": "Tflt<'row DTTTFooter'<'col-sm-6'i><'col-sm-6'p>>",
                "iDisplayLength": 5,
                "bAutoWidth": false, //是否自适应宽度
                "serverSide": true,  //启用服务器端分页
                "oTableTools": {
                    "aButtons": [
                        "copy", "csv", "xls", "pdf", "print"
                    ],
                    "sSwfPath": "assets/swf/copy_csv_xls_pdf.swf"
                },
                "bFilter": false,//去掉搜索框
                "ordering": false, // 禁止排序
                "bLengthChange": false, //去掉页显示数量框
                "language": {
                    "search": "",
                    "sLengthMenu": "_MENU_",
                    "oPaginate": {
                        "sPrevious": "上一页",
                        "sNext": "下一页"
                    }
                },
                columns: [
                    {
                       data: 'IDNumber',
                       title: "身份证"
                    },
                   {
                       data: 'HomePhoneNumber',
                       title: "电话"
                   },
                   {
                       data: 'PatientAddress',
                       title: "地址"
                    }
                ],
                "ajax": function (data, callback, settings) {

                    var param = {};
                    param.limit = data.length;//页面显示记录条数,在页面显示每页显示多少项的时候
                    param.start = data.start;//开始的记录序号
                    param.page = (data.start / data.length) + 1;//当前页码
                    var page = param.page;
                    var limit = param.limit;
                    $.ajax({
                        type: "get",
                        url: 'ajax/test.ashx',
                        data: { action: 'test', PageIndex: page, PageSize: limit },//传入组装的参数
                        cache: false,  //禁用缓存
                        dataType: "json",
                        success: function (result) {
                            if (result != null) {
                                //封装返回数据
                                var returnData = {};
                                returnData.draw = data.draw;//这里直接自行返回了draw计数器,应该由后台返回
                                returnData.recordsTotal = result.v.Total;//返回数据全部记录
                                returnData.recordsFiltered = result.v.Total;//后台不实现过滤功能,每次查询均视作全部结果
                                returnData.data = result.v.RowData;//返回的数据列表
                                //调用DataTables提供的callback方法,代表数据已封装完成并传回DataTables进行渲染
                                //此时的数据需确保正确无误,异常判断应在执行此回调前自行处理完毕
                                callback(returnData);//回调函数
                            }
                        }
                    });

                },
                columnDefs: [//跨行代码
                    {
                        targets: 0,//第0列
                        createdCell: function (td, cellData, rowData, row, col) {
                            var RowsPan = rowData.RowsPan; //合并行数
                            var PatitionOrderId = rowData.PatitionOrderId; //区域内排序标识
                            if (PatitionOrderId == 1) {
                                $(td).html('<button class="btn btn-' + showcolor+' btn-circle  btn-circle-lg" type="button" style="display: block;width: 100px;height: 100px;"><p class="name">' + rowData.Name + '</p></button>');
                            } else {
                                $(td).remove();
                            }

                        }
                    }
                    ,
                    {
                        targets: [1,2],//其他列我是为了加背景颜色
                        createdCell: function (td, cellData, rowData, row, col) {
                            if (rowData.IsAddColor) {
                                $(td).css("background-color", "#A4D3EE");
                            }
                        }
                    }

                ]
            });
            //---------------------------初始化Datatable End---------------------------
            //点击+号展开
            $('#example tbody').on('click', 'td span.details-control', function () {
               //找到父表的最后一行数据,将子表放在最后一行的下面
                var tr = $("#example>tbody>tr:last");
                var row = oTable.row(tr);
                if (row.child.isShown()) {//收缩
                    row.child.hide();
                    tr.removeClass('shown');
                }
                else {//展开
                    var table = '';
                    $.ajax({
                        type: "get",
                        url: 'ajax/test.ashx',
                        data: { a: 'querylist', Id: row.data().Id },//传入组装的参数
                        cache: false,  //禁用缓存
                        dataType: "json",
                        async: false,
                        success: function (result) {
                            var str = "";
                            var data = result.RowData;
                            if (result.Total > 0) {
                                //拼接表格头部
                                table += '<table id="childTable_' + row.index() + '" class="table table-striped">';
                                table += '<thead><tr class="active"><th><input type="checkbox" class="chkheader" onclick="ChkHeader(\'' + row.data().Id + '\',this,\'' + row.index() + '\')"/>id</th><th>姓名</th></tr></thead>';
                                table += '<tbody>';
                                //拼接表格身体部分
                                for (var i = 0; i < result.v.Total; i++) {
                                    table += '<tr><td><input type="checkbox" data-datas=\'' + JSON.stringify(data[i]) + '\' name="chkChild' + row.data().Id + '"/></td><td>' + data[i]["Name"] + '</td></tr>';
                                }
                                table += '</tbody></table>';
                            }
                        }
                    });
                   //将html代码转为jquery对象
                   //$(table).DataTable和$(table).dataTable是不一样的,不要弄错
                    var childTable = $(table).DataTable({
                        order: [0, "desc"],
                        columnDefs: [{
                            sortable: false,
                            targets: [1, 2]
                        }],
                        "language": {
                            "search": "",
                            "sLengthMenu": "_MENU_",
                            "oPaginate": {
                                "sPrevious": "上一页",
                                "sNext": "下一页"
                            }
                        },
                        "bFilter": false,//去掉搜索框
                        "ordering": false, // 禁止排序
                        "bLengthChange": false, //去掉页显示数量框
                    });
                    //将子表放到最后一行的下面
                    row.child(childTable.table().container()).show();
                    tr.addClass('shown');
                }
            });

        });                  

jquery代码po完了

来说后台返回数据的问题(我的分区条件是手机号和身份证相同的判断为同一人)

 要得到的数据结构

rownumber:自增标识(有多少条数据)

PatitionId:分区后自增标识(有多少个区块,每个区块下的数据条数不一样),看做总数用于分页

PatitionOrderId:分区后区域内自增标识

RowsPan:跨行数

po上数据库代码

with ranks as
(
    select row_number() over(partition by Mobile,IDCard order by r.createtime desc) PatitionOrderId  ,r.* from Users r --where r.Name like '%张%' --查询条件
),
counts as 
(
    SELECT MAX(c.PatitionOrderId) RowsPan,ROW_NUMBER() OVER ( ORDER BY (SELECT 0)) AS PatitionId ,c.Mobile,c.IDCard from ranks c group by c.Mobile,c.IDCard
)
select * from (
select ROW_NUMBER() OVER ( ORDER BY (SELECT 0)) AS rownumber,counts.PatitionId,counts.RowsPan,ranks.* from ranks  
left join  counts 
on ranks.Mobile = counts.Mobile and ranks.IDCard = counts.IDCard 
)temp --where PatitionId>(1-1)*2 and PatitionId<=1*2 --分页

这个分页我是我写成了存储过程的,因为方便一点,自行封装吧。。。

简单版本来了

 写完啦!!!~~~

 最近写博客,感觉自己相当敷衍,就是po就完了。。。。

 批评一下自己

猜你喜欢

转载自www.cnblogs.com/MuZiLily/p/12035035.html
今日推荐