您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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 = 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 方法中的$$$位置
因為在觸發表格自適應方法后調用了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列自適應內容寬度”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。