EasyUI数据表格datagrid列⾃适应内容宽度的实现
项⽬初期在加载数据表格的时候为了提⾼表格数据渲染速度,设置了默认宽度。
现需求需要加⼀个表格⾃适应的功能,触发改功能,改变列宽度,但是不重新渲染表格,不发⽣数据请求。
设计思路,遍历每项的所有数据,⽐较字节符串长度,取最⼤长度。再⽤最⼤长度和标题长度⽐较,如果标题长就去标题长度,如果字符串长,就取字符串的。
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 = ws;//数据表格请求的数据,即每⾏的数据
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){
easyuidatagridif(Str==null){
return 0;
}
Str = String();//该⽅法将取到的数据转为String类型
Str = place(/\s+/g,'');//替换空格
/
/两个字节为长度1,⼀个字节为长度0.5,计算字符串总长度
var newStr = (place(/[ 00- ff]+/g,'').length)/2
+place(/[ 00- ff]+/g,'').length;
return newStr;
}
调⽤以上两个⽅法就可以实现列宽⾃适应。
但是发现执⾏此⽅法之后,表头和表⾝的单元格宽度都已经固定写死,如果此时触发调整列宽⼤⼩事件,只能改变表头宽度,不会改变表⾝列宽,所以⾃适应列宽后可以取消改变列宽⼤⼩的功能
封装冻结列⽅法:
//冻结列,禁⽌调节列尺⼨$("#id").datagrid('lockColumn',field值);
$.extend($.hods, {
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'); // 获取数据表格监听改变列宽事件的节点
});
}
});
在给每列设置宽度的时候调⽤该⽅法
dg.datagrid('lockColumn',field);
changeWidth ⽅法中的※※※位置
在重新定义列宽的时候如果数据量过⼤会导致页⾯卡顿,可以再触发该⽅法的开始位置调⽤datagrid的loading⽅法,结束时调⽤loaded⽅法,changeWidth ⽅法中的$$$位置
因为在触发表格⾃适应⽅法后调⽤了datagrid的冻结列⽅法,所以再重新查询数据的时候表头不会重新渲染,只有表⾝会,,表⾝就会恢复默认宽度,就会出现表头和表⾝对不齐的问题,表头也不能改变宽度。
解决办法,在数据表格数据加载成功时取消冻结列,清空之前计算的列宽
封装取消冻结列⽅法
//取消冻结列,允许调节列尺⼨$("#id").datagrid('unlockColumn',field值);
$.extend($.hods, {
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'); // 获取数据表格监听改变列宽事件的节点
});
}
});
数据加载成功触发
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('');//清空表格⾃适应时计算的表头宽度
}
},
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。