jqGrid TreeGrid 載入數據 排序 擴展

来源:https://www.cnblogs.com/cl-blogs/archive/2019/05/08/10829279.html
-Advertisement-
Play Games

發現 jqGrid TreeGrid 載入的數據必須要排序 給了兩種平滑數據模式盡然不內部遞歸 所以改了下源碼加了個數據二次過濾器擴展 數據本該是這樣的 結果沒排序成這樣了 (而且還得是從根節點到子節點整體排序) 1. loadFilters: 數據過濾器擴展 (順帶把ParentId為非字元串類型 ...


  • 發現 jqGrid TreeGrid 載入的數據必須要排序
  • 給了兩種平滑數據模式盡然不內部遞歸
  • 所以改了下源碼加了個數據二次過濾器擴展

 

數據本該是這樣的

結果沒排序成這樣了 (而且還得是從根節點到子節點整體排序)

 

1. loadFilters: 數據過濾器擴展 (順帶把ParentId為非字元串類型導致初始化後沒閉合bug解決了) 

$.extend($.jgrid.defaults, {
        loadFilter: function (d) {

            function compare(name, minor) {
                return function (o, p) {
                    var a, b;
                    if (o && p && typeof o === 'object' && typeof p === 'object') {
                        a = o[name];
                        b = p[name];
                        if (a === b) {
                            return typeof minor === 'function' ? minor(o, p) : 0;
                        }
                        if (typeof a === typeof b) {
                            return a < b ? -1 : 1;
                        }
                        return typeof a < typeof b ? -1 : 1;
                    } else {
                        thro("error");
                    }
                }
            }
            function rawdata(r, parentField) {
                if (!(r instanceof Array)) {
                    r[parentField] = r[parentField].toString(); //轉string初始化才會閉合
                    r['isLeaf'] = true;
                    return r;
                }
                var datatmp = [];
                for (var i = 0; i < r.length; i++) {
                    var children = r[i]['children'];
                    r[i]['children'] = null; 
                    r[i][parentField] = r[i][parentField].toString(); //轉string初始化才會閉合
                    r[i]['isLeaf'] = !children;
                    datatmp.push(r[i]);
                    if (children) datatmp = datatmp.concat(rawdata(children, parentField));
                }
                return datatmp;
            }

            var data = d.rows;
            var idField, treeField, parentField, seqField, level_field;
            idField     = this.p.treeReader.id_field || 'id';
            parentField = this.p.treeReader.parent_id_field || 'pid';
            levelField  = this.p.treeReader.level_field || idField//'level'
            seqField    = this.p.treeReader.seq_field || idField//'seq' // 註意:綁定上是顯示欄位用 treeField 

            if(seqField != idField)  data.sort(compare(levelField, compare(seqField)));
            else data.sort(compare(seqField) );

            var i, l, treeData = [], tmpMap = [];
            for (i = 0, l = data.length; i < l; i++) {
                tmpMap[data[i][idField]] = data[i];
            }
            for (i = 0, l = data.length; i < l; i++) {
                if (tmpMap[data[i][parentField]] && data[i][idField] != data[i][parentField]) {
                    if (!tmpMap[data[i][parentField]]['children'])
                        tmpMap[data[i][parentField]]['children'] = []; 
                    tmpMap[data[i][parentField]]['children'].push(data[i]);
                } else { 
                    data.sort(function (a, b) { return a[seqField] - b[seqField]; }); //從小到大排序
                    treeData.push(data[i]);
                }
            }
            d.rows = rawdata(treeData, parentField);
            return d;
        }
    });
xxoo

 

2. TreeGrid配置數據

 1     "treeGrid": true,
 2     "ExpandColumn": "Title",
 3     "treedatatype": "json",
 4     "treeGridModel": "adjacency",  //選adjacency模式 (nested模式真zz,怎麼會有這種數據格式) 
 5     "treeReader": {
 6         "id_field": "Id",              //Id       非空
 7         "parent_id_field": "ParentId", //父節點Id 非空  
 8         "level_field": "Level",        //層級     非空
 9         "seq_field": "seq",            //層級排序 可選欄位 預設Id排序
10         //"leaf_field": "isLeaf",      //葉節點過濾內已處理
11     },    
jQuery(document).ready(function($) {
        jQuery('#jqGrid').jqGrid({
            "url": '@Url.Action("GetMenu", "Setup")',
            "datatype": "json", //json", //data: jsondata,
            "colModel":[
                    { name: 'Id', "key": true, "width": 50 }, // "hidden": true,
                { lable:'PId' , name: 'ParentId', width: 70 },
                 { label: '名稱', name: 'Title', width: 180,  },
                 { label: '圖標', name: 'img', width: 180 },
                 { label: '地址', name: 'href', width: 300 },
                 { label: '排序', name: 'seq', width: 80 },
                 { label: '打開方式', name: 'Target', width: 80 },
                 { label: '層級', name: 'Level', width: 80 },
                 { label: '刪除', name: 'IsDel', width: 80 }
            ],
            "hoverrows":false,
            "viewrecords":false,
            "gridview":true,
            "height":"auto",
            "rowNum":100,
            "scrollrows": true,

            //"loadonce": true,
            "treeGrid": true,
            "ExpandColumn": "Title",
            "treedatatype": "json",
            "treeGridModel": "adjacency",  //選adjacency模式 (nested模式真zz,怎麼會有這種數據格式) 
            "treeReader": {
                "id_field": "Id",              //Id       非空
                "parent_id_field": "ParentId", //父節點Id 非空  
                "level_field": "Level",        //層級     非空
                "seq_field": "seq",            //層級排序 可選欄位 預設Id排序
                //"leaf_field": "isLeaf",      //葉節點過濾內已處理
            },
            "pager": "#jqGridPager"
        });
    });
完整綁定

 

3.jsGrid.js源碼修改 2處

//>1 註冊過濾器擴展方法
$.fn.jqGrid = function( pin ) {
    if (typeof pin === 'string') {
        ........
    }
    return this.each( function() {
                ........
        var p = $.extend(true, {
            loadFilter: null, //就加這一行  ajax載入數據後二次過濾
            url: "",
            height: 150,

 

  //>2 調用過濾器 搜索 case "script" 或 $.ajax
  case "script":
        $.ajax($.extend({
            url:
                        ........
            success: function (data, st, xhr) {
                if ($.isFunction(ts.p.loadFilter)) { 
                    //添加這個if塊即可   載入數據後二次過濾
                    data = ts.p.loadFilter.call(ts,data);
                }     
                if ($.isFunction(ts.p.beforeProcessing)) {
                                 .......
                            }  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是MVP MVP:全稱 Model View Presenter。 MVP框架由3部分組成:View層負責顯示,Presenter層負責邏輯處理,Model層提供數據。 View:負責繪製UI元素、與用戶進行交互(在Android中體現為Activity,Fragment) Model:負責 ...
  • 版權聲明:本文為xing_star原創文章,轉載請註明出處! 本文同步自http://javaexception.com/archives/82 背景: 做了很多年的app開發,貌似沒見過沒有搜索功能的,搜索這個功能還真是挺常見的,一般包括本地搜索,比如筆記類的,有道雲筆記,或者Leanote,或者 ...
  • 跳轉app對應的系統通知設置 if (UIApplicationOpenSettingsURLString != NULL) { UIApplication *application = [UIApplication sharedApplication]; NSURL *URL = [NSURL U ...
  • 全志R311是一種功能強大的處理器,具有四核CortexTM-A7 CPU,工作頻率可達1.8GHz。它還集成了Mali-400雙核gpu,H.265 1080p@60fps視頻解碼器,H.264 1080p@60fps編碼器,13MP攝像機ISP,Trustzone等。為了提供更好的架構可擴展性, ...
  • Mixin Messenger 早期採用 FMDB 後來切換至 WCDB 沿用至今,一直比較可靠穩定,這裡分享一下使用心得和功能擴展。 ...
  • 首先我們來看看仿寫之後的效果: 看到是這個界面我們首先應該思考這些按鈕是怎麼做出來的?有了一個整體的思路之後才知道該怎麼辦。最開始我想的就直接利用button控制項上面直接加上png的圖片就可以形成一個按鈕了,但當我加入圖片之後,發現因為圖片太大導致一個按鈕都會占據一個屏幕一半的空間,實在是得不償失, ...
  • MT6763)具有集成的藍牙、fm、wlan和gps模塊,是一個高度集成的基帶平臺,包括數據機和應用處理子系統,啟用LTE/LTE-A和C2K智能手機應用程式。該晶元集成了ARM Cortex-A53,工作頻率可達2.0GHz,並集成了功能強大的多標準視頻編解碼器。此外,一組廣泛的介面D連接外圍 ...
  • 昨天:android studio安裝好後,在網上學習了一些基礎知識,來豐富自己對android開發的經驗,因為自己在安卓開發這一塊完全就是小白,所以基礎很重要。 看看成果吧: 遇到的問題: 1.在運行時,一個為R的文件經常性報錯,通過ctrl定位發現R為layout文件中所有的綜合,它包含所有文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...