jqGrid 迭代子网格中的网格数据

2023-12-02

我想迭代网格对象中包含的所有数据。 我的网格有一个包含子网格对象的定义,并以这种方式创建

var grid = $(gridID);
var pager = $(pagerID);
grid.jqGrid({
    url: GetBaseWSUrl() + 'MyWs.asmx/MyMethod',
    colNames: ['UMLT', 'FF', 'PC'],
    colModel: [
            { name: 'Name', index: 'Name', width: 180, template: colTextTemplate },
            { name: 'AlertFF', index: 'AlertFF', width: 22, align: 'center', sortable: false, formatter: "checkbox", formatoptions: { disabled: false} },
            { name: 'AlertPC', index: 'AlertPC', width: 22, align: 'center', sortable: false, formatter: "checkbox", formatoptions: { disabled: false} }
        ],
    [...]
    subGrid: true,
    subGridOptions: {
        "plusicon": "ui-icon-triangle-1-e",
        "minusicon": "ui-icon-triangle-1-s",
        "openicon": "ui-icon-arrowreturn-1-e",
        "reloadOnExpand": true,
        "selectOnExpand": true
    },
    subGridRowExpanded: function (subgrid_id, row_id) {
        var subgrid_table_id = subgrid_id + "_t";
        $("#" + subgrid_id).html("<table id='" + subgrid_table_id + "' class='scroll'></table>");
        $("#" + subgrid_table_id).jqGrid({
            [...] omitted for brevity
        });
    }
});

我知道我可以使用像这样的代码来迭代数据,并且它有效地适用于第一级,但我正在寻找一种允许我甚至在子网格数据上进行迭代的方法。

var grid = $('#grid');
var m = grid.getDataIDs();
for (var i = 0; i < m.length; i++) {
    var record = grid.getRowData(m[i]);
    //do something with the record
}

有什么办法可以做到这一点吗?


OK. In 答案 and in this one我描述了如何最有效地枚举网格行。如果您更多地使用 jQuery 而不是 DOM,那么代码可能会让您看起来很奇怪。我收到一些问题,使用 DOM 元素是否安全?使用 jQuery 不是更好吗?因此,我首先尝试回答这些问题并解释为什么我认为这是最好的方法。如果您只对结果代码感兴趣而不是对解释感兴趣,您可以跳过我的答案部分。

主要思想是$('#grid')是一个 jQuery 包装器HTML 文档对象模型<table> object。表 DOM 对象 (HTMLTableElement) $('#grid')[0] has rows属性是网格行的集合:集合<tr>DOM 元素 (HTMLTableRowElement)。可以迭代每个索引的网格行:$('#grid')[0].rows[i]从 0 开始。如果知道 rowid(<tr> element)则可以得到对应的<tr>DOM 对象关于$('#grid')[0].namedItem[rowid]。所以rows是集合DOM 元素具有cells财产。如果你想检查网格第 i 行的第 j 列的内容,你可以得到<td>元素直接由$('#grid')[0].rows[i].cells[j]。如果您只知道列名,则可以检查colModel数组并搜索具有name您需要的财产。如果索引在colModel数组是j您可以使用中的索引$('#grid')[0].rows[i].cells[j]表达。

重要的是rows收集和namedItem方法是 W3C 标准的一部分(请参阅here and here)。所以就是真的很安全在那里使用。所有浏览器都填写rows集合和所有浏览器都有本机代码(!!!) 实现快速索引rows集合并通过 id 在集合中快速搜索(我的意思是namedItem方法)。 jqGrid 内部永久使用这些,这就是 jqGrid 运行速度快的原因。 jQuery 是内部使用 DOM 的 JavaScript 库。它可能不如本机浏览器代码那么快。在某些情况下,例如位置或宽度的计算,有很多技巧可以在所有 Web 浏览器中正确获取信息,但使用 HTML 表 DOM 是W3标准在这里使用 jQuery 并没有给你带来任何优势。

在我的一些旧答案中我使用了代码grid.getDataIDs()并通过 ids 进行。现在我建议您遵循以下代码答案。关于子网格和其他行的唯一评论。

jqGrid有4种类型<tr>元素有 4 个不同的类。所以你可以检查类<tr>元素来确定该行是否包含子网格、分组标题、标准行或隐藏的第一行,内部使用这些元素来设置列的宽度。

var grid = $('#grid')[0], rows = grid.rows,
    cRows = rows.length, iRow, row, trClasses;

    for (iRow = 0; iRow < cRows; iRow++) {
        row = rows[iRow]; // row.id is the rowid
        trClasses = row.className.split(' ');
        if ($.inArray('jqgrow', trClasses) > 0) {
            // the row is a standard row
        } else if ($.inArray('ui-subgrid', trClasses) > 0) {
            // the row contains subgrid (only if subGrid:true are used)
        } else if ($.inArray('jqgroup', trClasses) > 0) {
            // the row is grouping header (only if grouping:true are used)
        } else if ($.inArray('jqfoot', trClasses) > 0) {
            // the row is grouping summary (only if grouping:true are used)
            // and groupSummary: [true] inside of groupingView setting
        } else if ($.inArray('jqgfirstrow', trClasses) > 0) {
            // the row is first dummy row of the grid. we skip it
        }
    }

现在如果你有row这是标准网格行,您可以检查名称为“AlertFF”的列中的复选框。首先,您应该获取列的索引(在循环之外)。你可以用小getColumnIndexByName方法来自答案: var iCol = getColumnIndexByName($('#grid'), 'AlertFF')。现在在身体内部if ($.inArray('jqgrow', trClasses) > 0)你可以做

if ($.inArray('jqgrow', trClasses) > 0) {
    if ($(row.cells[iCol]).children("input:checked") > 0) {
        // the checkbox in the column is checked
    }
}

检查来自的数据子网格作为网格您使用的您可以执行以下操作

...
} else if ($.inArray('ui-subgrid', trClasses) > 0) {
    // the row contains subgrid
    var subgridTable = $(row).find("table.ui-jqgrid-btable:first");
    // you can work with the subgridTable like with a grid
}

以你得到的方式subgridTable它具有相同的结构$('#grid')我们从这里开始。您可以像我之前描述的那样检查子网格的包含情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jqGrid 迭代子网格中的网格数据 的相关文章

随机推荐

  • ADO.NET 的 SqlCommand.CommandTimeout 如何工作?

    考虑一个存储过程 它在不使用事务的情况下大约在 60 秒内更新一些行 我们设置ADO NET的SqlCommand 超时至 30 秒 SqlCommand Timeout 30 当超时发生在 30 秒时 存储过程是否会继续在数据库服务器中运
  • 启动一个完全独立于Python的进程

    我正在尝试从 python 启动一个完全独立的进程 我不能使用像这样简单的东西os startfile因为我需要传递参数 目前我正在使用subprocess popen这让我完成了 90 的任务 args some exe exe some
  • MPMovies PlayerViewController 进入背景时变黑

    我的 MPMoviePlayerViewController 有问题 当应用程序进入后台然后我再次启动它或转到另一个 viewControllers 时 电影变黑了 我有在菜单背景中播放的电影 这是我的代码 编辑代码 void viewDi
  • 页面刷新后保留下拉列表的选定值

    我有一个按钮可以根据多个下拉值中的选择来过滤列表 但是 我遇到了一个问题 一旦单击按钮 页面就会刷新 并且下拉值将重置为默认值 如何确保刷新后所选值保留在下拉列表中 div div
  • 隐含的路径归纳

    这是一个后续问题在 Agda 中进行路径归纳 我想知道什么时候这个结构可能更具表现力 在我看来 我们总是可以这样表达 f forall A gt x y A gt x y gt some type f refl instance of so
  • MySQL:获取父子结构的根节点

    我有一个与此类似的表 Id ParentId 1 0 2 1 3 0 4 3 5 3 6 0 7 6 8 7 给定一
  • 如何使用 C# Parallel.For 实现 OpenMP 多级代码

    如何使用 C Parallel For 在以下 OpenMP 代码中实现 OpenMP 代码 pragma omp parallel float data new float 1000 pragma omp for for int i 0
  • 即使未注册,也会在 WooCommerce 感谢页面上显示客户详细信息

    在 WooCommerce 中 对于登录用户 感谢 已收到订单 页面确实会显示客户详细信息 例如姓名 地址和电子邮件 但是当客户未注册时什么也没有 如何确保非注册用户在支付成功后 能像注册用户一样在Thankyou 已下单 页面看到自己的详
  • 如何使用HtmlAgilityPack进行异步调用?

    我正在尝试获取带有 id 的表table matches可用的here 问题是表是使用加载的ajax所以我没有得到完整的html下载页面时的代码 string url http www oddsportal com matches socc
  • 如何使用 Firestore 数据库快照填充表日历

    我正在尝试填充要在 TableCalendar 上显示的事件地图 使用表日历包 要填写事件 我需要一个 Map 所以一开始我创建了这个 Map
  • VB.net 到 MySql 存储过程错误

    我是存储过程的新手 所以我可能会错过一些简单的东西 但我研究了基础知识 并且一直试图从 vb net 代码集成它 我创建了一个简单的存储过程 我认为 它只运行今天结果的数据查询 例行DDL 注意 例程主体前后的注释不会被服务器存储 DELI
  • 显示最后一个非空单元格的地址(如果值不唯一)

    我有以下 Excel 电子表格 A B C D E F 1 Jan Feb March April May 2 Profit 100 200 200 3 Cell Reference last non empty cell In Row 2
  • 如果超过 78 个字符,则使用 TIMESTAMP 的 TO_CHAR 会引发 ORA-01877

    我面临一个奇怪的问题 我正在尝试将一些数字转换为 单词 只需这样做 TO CHAR TO TIMESTAMP LPAD nvl trunc 99999999 0 9 0 FF9 FFSP AS amt in words 效果很好 输出是 九
  • 在 webfaction 上隐藏安全 django 设置信息

    我试图隐藏 webfaction 上 django 应用程序的数据库密码等安全信息 但我找不到如何以及在哪里使用环境变量设置这些信息 我开发了一个可以用 pip 安装的包 pip install djangosecure 在你的 setti
  • 单元测试 Angular Observables

    我是测试领域的新手 刚刚开始为现有的 Angular 2 代码编写单元测试 我有一个函数confirmDelete返回Obserable
  • DataTables+Datepicker 按日期范围过滤表

    尝试使用两个有界日期选择器按日期范围实现数据表过滤器 我在 SO 上见过很少类似的问题 但没有一个答案对我有用 到目前为止 我设法实现了界面元素 但不知道如何将它们组合在一起以进一步进行 任何帮助表示赞赏 var myTableData i
  • 在 R 包中包含 TMB C++ 代码的指南

    我最近发现了 TMB 的神奇之处 并且正在开发一个包 最好在其中包含 TMB c 模板 以用于计算成本相当高的模型 我假设有可能 在软件包安装时自动编译 TMB 源代码 但我在 TMB 文档中找不到与此相关的任何明确指南 到目前为止 我的替
  • 如何在 C# 中创建 Trie [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有谁知道在哪里可以找到如何在 C 中构造 trie 的示例 我正在尝试使用字典 单词列表并用它创建一个字典树 这是我自己的代码 从我的答案中提取如何
  • 使用 Java 8 Streams 的收集器根据现有键/值对增加值

    假设有一个List然后Object包含两个方法 getUserId and getPoints 考虑一下List包含三个对象 它们包含以下数据 userId A 3 points userId A 5 points userId B 1 p
  • jqGrid 迭代子网格中的网格数据

    我想迭代网格对象中包含的所有数据 我的网格有一个包含子网格对象的定义 并以这种方式创建 var grid gridID var pager pagerID grid jqGrid url GetBaseWSUrl MyWs asmx MyM