jqGrid 中的自定义聚合/分组

2023-11-28

Overview

我需要以某种方式自定义 jqGrid 插件,无论是通过巧妙的技巧、黑客攻击还是修改插件,以支持以下类型的聚合/分组。

我将非常感谢 jqGrid 社区关于如何实现这一点的一些想法。

Details

聚合/分组的工作原理如下。

首先向用户呈现如下所示的数据网格,并根据“第 1 列”进行分组。注意超链接(例如“+5”);这些超链接表示“折叠”行,其中这些行中的所有数据对于除具有超链接的列之外的所有列都具有相同的值。

enter image description here

例如,通过单击“+5”链接,表格将展开以显示先前折叠为一行的 5 行(替换包含“+5”链接的折叠行)。请注意,现在展开的行在第 2 列中都具有唯一值,该列之前具有“+5”链接。

enter image description here

关于如何实现这一点有什么想法吗?这可以与任何其他网格插件一起使用吗?


jqGrid 不直接支持您需要的这种分组,因此必须实现某种手动分组。

分组本身应该在服务器上完成,并且服务器响应应该包含扩展行和折叠行。我不太明白作为一组扩展链接应该如何工作,因此我描述了如何通过每行一个链接来实现分组。另一方面,我决定实现先前展开的行的折叠。我针对 JSON 数据中包含的附加信息执行此操作。

让我们的服务器生成以下 JSON 数据:

{
  "total": 1,
  "page": 1,
  "records": 15,
  "rows" : [
    {"id":"1", "collapseTo":{"id":"6","colName":"column2"}, "expandTo":null, "column1":"534345345", "column2":"3523423423", "column3":"8563564", "column4":"75683", "column5":"4756436", "column6":"87689768", "column7":"8755"},
    {"id":"2", "collapseTo":{"id":"6","colName":"column2"}, "expandTo":null, "column1":"534345345", "column2":"545345343", "column3":"8563564", "column4":"75683", "column5":"4756436", "column6":"7689768", "column7":"8755"},
    {"id":"3", "collapseTo":{"id":"6","colName":"column2"}, "expandTo":null, "column1":"534345345", "column2":"4234235", "column3":"8563564", "column4":"75683", "column5":"4756436", "column6":"7689768", "column7":"8755"},
    {"id":"4", "collapseTo":{"id":"6","colName":"column2"}, "expandTo":null, "column1":"534345345", "column2":"3242323", "column3":"8563564", "column4":"75683", "column5":"4756436", "column6":"7689768", "column7":"8755"},
    {"id":"5", "collapseTo":{"id":"6","colName":"column2"}, "expandTo":null, "column1":"534345345", "column2":"6453334", "column3":"8563564", "column4":"75683", "column5":"4756436", "column6":"7689768", "column7":"8755"},
    {"id":"6", "collapseTo":null, "expandTo":{"column2":["1","2","3","4","5"]}, "column1":"534345345", "column2":"+5", "column3":"8563564", "column4":"75683", "column5":"4756436", "column6":"7689768", "column7":"8755"},
    {"id":"7", "collapseTo":{"id":"9","colName":"column4"}, "expandTo":null, "column1":"763484", "column2":"773845358", "column3":"7657565663", "column4":"87546598", "column5":"75675634", "column6":"89058", "column7":"3453463"},
    {"id":"8", "collapseTo":{"id":"9","colName":"column4"}, "expandTo":null, "column1":"763484", "column2":"773845358", "column3":"7657565663", "column4":"98976989", "column5":"75675634", "column6":"89058", "column7":"3453463"},
    {"id":"9", "collapseTo":null, "expandTo":{"column4":["7","8"]}, "column1":"763484", "column2":"773845358", "column3":"7657565663", "column4":"+2", "column5":"75675634", "column6":"89058", "column7":"3453463"},
    {"id":"10", "collapseTo":{"id":"17","colName":"column6"}, "expandTo":null, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"909424", "column7":"9768768"},
    {"id":"11", "collapseTo":{"id":"17","colName":"column6"}, "expandTo":null, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"22934920", "column7":"9768768"},
    {"id":"12", "collapseTo":{"id":"17","colName":"column6"}, "expandTo":null, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"124376325", "column7":"9768768"},
    {"id":"13", "collapseTo":{"id":"17","colName":"column6"}, "expandTo":null, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"36727845", "column7":"9768768"},
    {"id":"14", "collapseTo":{"id":"17","colName":"column6"}, "expandTo":null, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"6856345", "column7":"9768768"},
    {"id":"15", "collapseTo":{"id":"17","colName":"column6"}, "expandTo":null, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"43536366", "column7":"9768768"},
    {"id":"16", "collapseTo":{"id":"17","colName":"column6"}, "expandTo":null, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"76543686", "column7":"9768768"},
    {"id":"17", "collapseTo":null, "expandTo":{"column6":["10","11","12","13","14","15","16"]}, "column1":"5378756", "column2":"75675473", "column3":"264523", "column4":"423543", "column5":"34534534", "column6":"+7", "column7":"9768768"}
  ]
}

可以使用隐藏列来保存附加信息。我用它代替jQuery.data这可以更有效地保存信息。具有分组链接的行在 JSON 数据中包含以下信息:"expandTo":{"column2":["1","2","3","4","5"]}。其他行包含"expandTo":null。代替loadComplete我们可以隐藏所有行"expandTo":null。在其他行中,我们将某些列的包含内容转换为链接。例如如果expandTo has {"column2":["1","2","3","4","5"]}那么我们应该将项目从“column2”列转换为链接。作为链接上的单击操作,我们将隐藏该行并使数组中的所有行["1","2","3","4","5"]可见的。

您可以找到演示这一点的演示here。单击链接后,分组将展开。双击展开的行会折叠行并使网格恢复到先前的状态。

对应的代码是:

var grid = $("#list"),
    myExpanding = function(e) {
        var myData = $(this).data("expandTo"), i, l;
        if (myData && typeof(myData.length) !== "undefined" && myData.length>0) {
            for (i=0,l=myData.length; i<l; i++) {
                $("#"+myData[i]).show();
            }
            $(this).closest("tr").hide();
        }
        e.preventDefault();
    }, cmNameToIndex = {};

grid.jqGrid({
    datatype:'json',
    url:'CustomGrouping.json',
    colNames:[//'Expand To',
        'Column 1','Column 2','Column 3','Column 4','Column 5','Column 6','Column 7'],
    colModel:[
        //{name:'expandTo', width:1, hidden:true},
        {name:'column1'},
        {name:'column2'},
        {name:'column3'},
        {name:'column4'},
        {name:'column5'},
        {name:'column6'},
        {name:'column7'}
    ],
    cmTemplate:{width:85,align:'center',sortable:false},
    rowNum:10000,
    gridview:true,
    jsonReader:{repeatitems: false},
    loadComplete: function(data) {
        var i=0, rows = data.rows, l = rows.length, cm = grid[0].p.colModel, rowid,
            idToItem = {}, item;
        // The ids of the rows which has in the first column (expandTo) the information
        // about rows which should be expanded will be saved in the nonHiddenRows array.
        // For the rows the expandingInfo[rowid]
        for(; i<l; i++) {
            item = rows[i];
            idToItem[item.id] = item;
        }
        // fill cmNameToIndex to find easier the column index by column name
        cmNameToIndex = {};
        for (i=0,l=cm.length;i<l;i++){
            cmNameToIndex[cm[i].name] = i;
        }
        $("tr.jqgrow",this).each(function(){
            var tr=$(this), colName, linkInfo, td, rowid = this.id, item = idToItem[rowid];
            //if ($.inArray(rowid,nonHiddenRows) !== -1) {
            if (item && item.expandTo) {
                //tr.show();
                linkInfo = item.expandTo;
                for (colName in linkInfo) {
                    if (linkInfo.hasOwnProperty(colName)) {
                        i = cmNameToIndex[colName];
                        td = $("td:nth-child("+(i+1)+")",this);
                        td.wrapInner($('<a>',
                                       {
                                         href:"#",
                                         click:myExpanding,
                                       }).data("expandTo",linkInfo[colName]));
                    }
                }
            } else {
                tr.hide();
            }
            if (item && item.collapseTo) {
                tr.data("collapseTo",item.collapseTo)
            }
        });
    },
    ondblClickRow: function(rowid, iRow, iCol, e) {
        var tr = $("#"+rowid), tr1 = $(e.target,grid[0].rows).closest("tr.jqgrow"),
            collapse = tr.data("collapseTo"), i, ids, l;
        if (collapse && collapse.id && collapse.colName) {
            i = cmNameToIndex[collapse.colName];
            tr = $("#"+collapse.id);
            ids = $("a", tr[0].cells[i]).data("expandTo");
            if (ids && ids.length) {
                tr.show();
                for(i=0,l=ids.length; i<l; i++) {
                    $("#"+ids[i]).hide();
                }
            }
        }
    },
    height: '100%'
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jqGrid 中的自定义聚合/分组 的相关文章

随机推荐

  • 是否有维护插入顺序的 IdentityHashMap 实现?

    我需要一个 HashMap 1 通过对象引用匹配键 并且 2 迭代时保持插入顺序 这些功能分别在 IdentityHashMap 和 LinkedHashMap 中实现 有没有办法获得适合我需要的数据结构 Java 标准或第 3 方库 如
  • Angular 6 中 MatDialog 关闭且数据库中的数据更新后如何刷新组件?

    我正在学习 Angular 6 的 MEAN 堆栈应用程序 在这里 我想在添加新的客户端 汽车 司机 预订或更新新的客户端 汽车 司机 预订后刷新组件 但是添加新值后 显示所有值的组件不会更新或刷新 当时无法看到当前值 但是当我在组件之间路
  • 什么是伞头?

    伞头基本上是什么 它有什么用 我收到如下所示的警告 这是什么意思
  • 什么是 UnsafeMutablePointer?如何修改底层内存?

    我正在尝试使用 SpriteKit 的SKMutableTexture类 但我不知道如何工作UnsafeMutablePointer lt Void gt 我有一个模糊的想法 它是指向内存中一系列字节数据的指针 但我该如何更新呢 这在代码中
  • 获取对象名称和函数名称

    这实际上是2个问题 1 有没有一种通用的方法来获取实例的类名 所以如果我有一个类 class someClass object 我想要一种内置的方式来给我一个字符串 someClass 2 与函数类似 如果我有 def someFuncti
  • C++ 没有指针或引用的虚函数调用

    据我所知 虚函数调用通常需要指针或引用 所以我对下面的代码感到非常惊讶 include
  • 上传意图函数 Dialogflow V2

    我正在尝试开发一个API来上传意图DialogflowV2 我已经尝试过下面的代码片段 但是如果尝试与它进行通信 它不起作用Dialogflow它确实有效 检测意图 并且确实得到了回复Dialogflow以便查询 允许 我是管理员 gt 服
  • 将 FopFactoryBuilder baseURI 设置为 jar 类路径

    我正在将 Apache FOP 1 0 项目升级到 Apache FOP 2 1 在此项目中 所有必需的文件都打包在 jar 文件中 我添加了新的 FopFactoryBuilder 来生成 FopFactory FopFactoryBui
  • CKEditor4:使文本不同于 HTML

    I add StrInsert plugin to my CKEditor It basically adds a button which in my editor is labeled CRM Field 该按钮的作用是将一个值附加到我
  • 首先将文本小写,然后大写。用CSS可以吗?

    首先将文本小写 然后大写 用CSS可以吗 编辑 示例 HELLO WORLD gt Hello World Edit2 我有一个全部大写的国家 地区列表 例如UNITED KINGDOM 我必须让它看起来像United Kingdom Ye
  • 在 ScrollViewer 中使用 WPF DataGrid 虚拟化

    我知道 DataGrid 支持虚拟化 因此它仅为可见行创建网格单元 但是 这似乎仅在 DataGrid 大小受到限制的情况下才有效 在我的场景中 DataGrid 放置在滚动查看器内 如下所示
  • 如何将 \x00 作为参数传递给程序?

    我有一个小程序 我希望将 shellcode 作为参数传递 在shellcode中 需要传递 x00 我尝试了以下命令 program python c print x01 x00 x00 x00 x9c xd8 xff xbf 但 x00
  • ag-网格行未删除

    我正在尝试从我的 ag Grid 中删除一行 如下所示 let alertRow RowNode this gridApi getRowNode rowIndex console log alertRow this gridApi upda
  • Borland x86 内联汇编器;获取标签的地址?

    我使用 Borland Turbo C 和一些内联汇编代码 因此大概是 Turbo Assembler TASM 风格的汇编代码 我希望做到以下几点 void foo bar void asm mov eax SomeLabel SomeL
  • 原则 2 映射引用唯一键

    基本问题 是否可以使用不引用主键而仅引用唯一键的 Doctrine 来映射关联 扩大的视野 我有一个实体 Participation which may参考2个其他实体 DropoutCause and DischargeType 根据此组
  • 错误:无法为 aiohttp 构建轮子,这是安装基于 pyproject.toml 的项目所必需的

    Python版本 3 11 通过以下方式安装应用程序的依赖项pip install r requirements txt给出以下错误 socket c o build temp linux armv8l cpython 311 aiohtt
  • 如何使用 Azure CLI(az ad 应用程序)创建范围

    使用 Azure CLI 2 x 我找不到在 Azure AD 门户中公开 API 部分下 添加范围 的方法 我所看到的是 如果我在创建应用程序时传递 identifier uris 则会自动设置 APP ID URI 和范围 az ad
  • 为什么在 Flux 应用程序架构中每个实体使用一个存储?

    我正在一个项目中使用reactjs 和flux 架构 我对如何将嵌套数据正确分解为存储以及为什么我应该将数据拆分为多个存储感到有点困惑 为了解释这个问题 我将使用这个例子 想象一个有项目的 Todo 应用程序 每个项目都有任务 每个任务都可
  • 变基合并提交

    假设我的 Git 存储库最初有两个分支 Foo 和 Bar Foo Bar 我创建了第三个分支 FooBar 在其中提交了其他两个分支的合并 Foo FooBar Bar FooBar 现在比 Foo 和 Bar 都领先一项 接下来 我做了
  • jqGrid 中的自定义聚合/分组

    Overview 我需要以某种方式自定义 jqGrid 插件 无论是通过巧妙的技巧 黑客攻击还是修改插件 以支持以下类型的聚合 分组 我将非常感谢 jqGrid 社区关于如何实现这一点的一些想法 Details 聚合 分组的工作原理如下 首