EasyUI 数据表格datagrid列自适应内容宽度(不需重新加载表格)

智数追光
• 阅读 5917

项目初期在加载数据表格的时候为了提高表格数据渲染速度,设置了默认宽度。
现需求需要加一个表格自适应的功能,触发改功能,改变列宽度,但是不重新渲染表格,不发生数据请求。

设计思路,遍历每项的所有数据,比较字节符串长度,取最大长度。再用最大长度和标题长度比较,如果标题长就去标题长度,如果字符串长,就取字符串的。
js

//表格自适应方法
function changeWidth(agstr){
    var dg = $('#'+agstr);
    dg.datagrid("loading");//显示加载状态$$$
    var fn=function(){
        var opts = dg.datagrid('getColumnFields');    //获取表头所有field
        var data=dg.datagrid('getData');//获取数据表格请求的数据
        var role = data.rows;//数据表格请求的数据,即每行的数据
            for (var i = 0; i <opts.length ;i++) {  //循环每一列的数据内容
                var field=opts[i];
                var ro_width = 0;
                if(field != ''){
                    var col = dg.datagrid('getColumnOption', field);
                    var col_title = col.title;
                    for(j=0;j<role.length;j++){
                        if(StringTolog(role[j][field])>ro_width){
                            ro_width = StringTolog(role[j][field]);//比较当前field列的每条数据长度,取最大值
                        }
                    }
                if(ro_width<StringTolog(col_title)){//如果当前列数据长度小于当前列表头长度则取表头长度
                    ro_width =StringTolog(col_title);
                }
        
                var ro_length=ro_width*14+10;//14是页面字体像素大小  10是单元格左右内边距大小
                $("td[field='"+field+"'] div").width(ro_length);//设置列宽样式
                dg.datagrid('lockColumn',field);//禁止数据表格改变列宽※※※
            }
        }    
        dg.datagrid("loaded");//隐藏加载状态$$$
    }
    setTimeout(fn,0);
}

//字符串的粗略换算
function StringTolog(Str){
    if(Str==null){
        return 0;
    }
    Str = Str.toString();//该方法将取到的数据转为String类型
    Str = Str.replace(/\s+/g,'');//替换空格
    //两个字节为长度1,一个字节为长度0.5,计算字符串总长度
    var newStr = (Str.length-Str.replace(/[\x00-\xff]+/g,'').length)/2
                    +Str.replace(/[\x00-\xff]+/g,'').length;
    return newStr;
}

调用以上两个方法就可以实现列宽自适应。
但是发现执行此方法之后,表头和表身的单元格宽度都已经固定写死,如果此时触发调整列宽大小事件,只能改变表头宽度,不会改变表身列宽,所以自适应列宽后可以取消改变列宽大小的功能
封装冻结列方法:

//冻结列,禁止调节列尺寸$("#id").datagrid('lockColumn',field值);
$.extend($.fn.datagrid.methods, {
    lockColumn: function(jq, field){
        return jq.each(function(){
            var p = $(this).datagrid('getPanel');    // 获取数据表格面板
            var cell = p.find('div.datagrid-header td[field=' + field + '] > div.datagrid-cell'); // 获取数据表格监听改变列宽事件的节点
            cell.resizable({disabled:true}); // 禁止改变列宽
        });
    }
});

在给每列设置宽度的时候调用该方法
dg.datagrid('lockColumn',field);
changeWidth 方法中的※※※位置

在重新定义列宽的时候如果数据量过大会导致页面卡顿,可以再触发该方法的开始位置调用datagrid的loading方法,结束时调用loaded方法,changeWidth 方法中的$$$位置
EasyUI 数据表格datagrid列自适应内容宽度(不需重新加载表格)

因为在触发表格自适应方法后调用了datagrid的冻结列方法,所以再重新查询数据的时候表头不会重新渲染,只有表身会,,表身就会恢复默认宽度,就会出现表头和表身对不齐的问题,表头也不能改变宽度。
解决办法,在数据表格数据加载成功时取消冻结列,清空之前计算的列宽
EasyUI 数据表格datagrid列自适应内容宽度(不需重新加载表格)
封装取消冻结列方法

//取消冻结列,允许调节列尺寸$("#id").datagrid('unlockColumn',field值);
$.extend($.fn.datagrid.methods, {
    unlockColumn: function(jq, field){
        return jq.each(function(){
            var p = $(this).datagrid('getPanel');    // 获取数据表格面板
            var cell = p.find('div.datagrid-header td[field=' + field + '] > div.datagrid-cell');  // 获取数据表格监听改变列宽事件的节点
            cell.resizable({disabled:false}); // 允许改变列宽
        });
    }
});

数据加载成功触发

onLoadSuccess: function (data) {
            var opts = $(this).datagrid('getColumnFields');    //获取表头所有field
             for(var i=0;i<opts.length;i++){
                 $(this).datagrid('unlockColumn',opts[i]);//允许调整列尺寸
                 $("tr.datagrid-header-row td[field='"+opts[i]+"'] div").width('');//清空表格自适应时计算的表头宽度
             }
        },

EasyUI 数据表格datagrid列自适应内容宽度(不需重新加载表格)

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
vue+element 表格formatter数据格式化并且插入html标签
前言   vue中element框架,其中表格组件,我既要行内数据格式化,又要插入html标签一贯思维,二者不可兼得也一、element表格数据格式化  !(https://oscimg.oschina.net/oscnet/3c43a1cb3cbdeb5b5ad58acb45a42612b00.p
Stella981 Stella981
4年前
Jquery创建表格、填充表格数据、重置表格
1.Jquery创建表格/创建表格@paramlabel标题@paramdata数据@paramtableElementhtml元素,表格插入至此元素中/functioncreateTable(label,data,tableElemen
Stella981 Stella981
4年前
Avue前端控件大全和表格属性
//表格属性//width:“100%”,//表格宽度//calcHeight:“auto”,//表格高度差(主要用于减去其他部分让表格高度自适应)//height:“auto”,//表格高度//maxHeight:“auto”,//表格最大高度//border:true,//是否显示表格边框//e
Wesley13 Wesley13
4年前
JS一个算法题
题目:实现超出整数存储范围的两个大整数想加function(a,b)。注意:参数a和b以及函数返回值都是字符串。目的:考算法,基本逻辑。我实现的基本思路是:①两个数字字符串长度补成一样,用字符串'0’补位,比如a'1111',b'22',b用'0'补位成'0022'.②分3中情况处理,初始值的长度比较,,a的长度大于b的长度,b的长
Stella981 Stella981
4年前
Beyond Compare表格比较怎设置对齐方式
BeyondCompare拥有强大的文件和文件夹比较功能,除此之外它也是一款好用的表格比较工具。在使用BeyondCompare(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.beyondcompare.cc%2F)进行表格比较时,如果数据的第一列为数字编号的话,那么可以通过
Wesley13 Wesley13
4年前
Java中的字符串的最大长度
Java中的字符串的最大长度看String的源码可以看出来,String实际存储数据的是charvalue\\,数组的长度是int类型,整数在java中是有限制的,我们通过源码来看看int类型对应的包装类Integer可以看到,其长度最大限制为2^311,那么说明了数组的长度是0~2^311,那么计算一下就是(2^31121474
Stella981 Stella981
4年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Stella981 Stella981
4年前
DataGear 制作按行滚动的轮播表格数据可视化看板
通过DataGear(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fdatagear.tech%2F)的表格图表轮播设置项(1.13.0版本新增),可以轻松制作按行滚动的轮播表格数据可视化看板。首先,新建表格所需的数据集,以如下CSV数据集为例:name,v
Stella981 Stella981
4年前
GridManager loading样式修改
在使用gridmanager表格组件时,如果想要改变loading样式该如何处理?gridmanager提供的loadingTemplate参数可以快速的解决这个问题。loadingTemplate参数的介绍:参数类型:String默认值:''数据加载中模板,该配置可以自定义数据加载时使用的loading样式。使用该
达里尔 达里尔
2年前
vue3+element-plus 表格数据不更新问题
vue3elementplus表格数据不更新问题,用vue3elementplus做项目,明明后台给的数据已经能够在控制台console出来了,但是表格还是不刷新
Python进阶者 Python进阶者
1年前
盘点一个Pandas实战需求的问题
大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【wen】问了一个Pandas解决实际需求的实战问题。问题如下:请教:代码的目的为自动填充产品名字,有多个销售数据的表格,如例子,销售数据表格中的的产品名字一列为空,我把销售数据表格
智数追光
智数追光
Lv1
羌笛何须怨杨柳,春风不度玉门关。
文章
4
粉丝
0
获赞
0