【问题标题】:Select a row in jqGrid based on cell value根据单元格值在jqGrid中选择一行
【发布时间】:2013-02-26 17:28:42
【问题描述】:
colModel: [
            { name: 'Id', index: 'Id', hidden: true, search: false },
            { name: 'Name', index: 'Name', hidden: true, search: false },
          ]

正如 setSelection 方法允许根据行号在 jqGrid 中选择一行一样,是否可以类似地根据其中一个单元格值选择一行。

例如在上面的 colModel 中,是否可以选择具有特定 'Id' 或 'Name' 值的行...假设这些值对于每一行都是唯一的。

【问题讨论】:

  • 您是使用multiselect: true 选项还是只想突出显示(使用一些颜色、背景颜色或添加特殊的CSS 类)网格中的行?
  • @Oleg 有没有办法从rowattr方法中获取当前的rowId?
  • @Oleg - 使用多选:真...
  • 我认为the answer 对你来说可能很有趣。
  • @Mark: rowattr 无法轻松访问id。必须从第二个参数(或在某些情况下从第一个参数)获取它。可以修改代码的the line,添加id作为rowattr的第三个参数。

标签: jqgrid


【解决方案1】:

在 jqGrid 的 loadComplete: 部分中,您可以遍历每一行并测试您正在寻找的值。如果找到该值,请选择该行。

loadComplete: function () {
    var rowIds = $(this).jqGrid('getDataIDs');

    for (i = 1; i <= rowIds.length; i++) {
        rowData = $(this).jqGrid('getRowData', i);

        if (rowData['Id'] == idSearchValue ) {
           $(this).jqGrid('setSelection',i); 
        } //if

    } //for
...

还有rowattr:,但我似乎找不到在哪里可以获得当前行的rowID。 Oleg 可能会看到这一点并做出回应,就像他对 jqGrid 的添加一样,但我的测试没有任何运气,或者阅读了您将在何处获取当前 rowId 以传递给 setSelection 方法的信息。

【讨论】:

  • 不能使用 jqGrid 的当前实现在 rowattr 内或通过使用 cellattr 等设置选择。有关主题,请参阅 the thread。马克,如果您愿意使用$(this).jqGrid("getCol", "Id", true),您可以从您的答案中改进代码。
  • 有趣...我总是从你的回答中学习!我将不得不考虑使用我需要遍历网格行!
  • @Mark - 所以遍历每一行并选择符合条件的那些......感谢方向
  • 为了避免复制和粘贴代码的人感到沮丧,我认为您应该在此 sn-p 中本地声明/范围内的变量。 var i;var rowData;
【解决方案2】:

如果您有一个包含单元格值的对象数组,您将需要另一种方法。

例如。使用您的colModel,您希望检索具有这些值的行:

let toSearch = [ 
        { Name: 'Arthur', Id: 150},
        { Name: 'Julien', Id: 90},            
]

那么你可以做的是从jqGrid表中检索整个数据并动态寻找值:

let data = $grid.jqGrid('getGridParam', 'data');
let toSelect = data.filter((row,i) => {
    return toSearch.some(toSelectRow => {
        for(let prop in prevRow) {
            if(prevRow[prop] != row[prop])
                return false;
        }
        return true;
    })
});

toSelect.forEach((row) => $grid.jqGrid('setSelection',row.id, false)); // Prevent firing onSelectRow event

这里我们通过false 来防止触发onSelectRow 事件,如果你需要它只需删除false

【讨论】: