jqGrid перебирает данные сетки в подсетке

Я хотел бы перебрать все данные, содержащиеся в объекте сетки. Моя сетка имеет определение, которое включает в себя объект подсетки, и создается таким образом

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
}

Есть ли способ сделать это?

1 ответ

Решение

ХОРОШО. В ответе и в этом я опишу, как наиболее эффективно перечислить строки сетки. Возможно, если вы больше работаете с JQuery, а не с DOM, код будет выглядеть странно для вас. Я получил вопросы, безопасно ли использовать элементы DOM? Не лучше ли вместо этого использовать jQuery? Поэтому я прежде всего пытаюсь ответить на вопросы и объяснить, почему я считаю, что это лучший способ. Если вас интересует только код результата, а не объяснение, вы можете пропустить часть моего ответа.

Основная идея заключается в том, что $('#grid') это оболочка jQuery для HTML DOM <table> объект. Объект DOM таблицы (HTMLTableElement) $('#grid')[0] имеет свойство ряда, которое является коллекцией строк сетки: коллекция <tr> Элементы DOM (HTMLTableRowElement). Можно перебрать строки сетки для каждого индекса: $('#grid')[0].rows[i] который начинается с 0. Если кто-то знает rowid (идентификатор <tr> element) тогда можно получить соответствующий <tr> DOM объект в отношении $('#grid')[0].namedItem[rowid], Итак rows это коллекция Элементы DOM, имеющие свойство ячейки. Если вы хотите проверить содержание j-го столбца i-го ряда таблицы, вы можете получить <td> элемент непосредственно $('#grid')[0].rows[i].cells[j], Если вы знаете только имя столбца, вы можете проверить colModel массив и поиск столбца, имеющего name недвижимость, которая вам нужна Если индекс в colModel массив j Вы можете использовать индекс в $('#grid')[0].rows[i].cells[j] выражение.

Важно то, что rows коллекция и namedItem Метод является частью стандарта W3C (см. здесь и здесь). Так что там действительно безопасно. Все браузеры заполняют rows коллекция и все браузеры имеют собственный код (!!!), который реализует быструю индексацию в rows Коллекция и быстрый поиск в коллекции по идентификатору (я имею в виду namedItem метод). jqGrid использует их постоянно, и это причина, по которой jqGrid работает быстро. JQuery - это библиотека JavaScript, которая использует внутренне DOM. Это может быть не так быстро, как родной код браузера. В некоторых ситуациях, таких как вычисление положения или ширины, есть много хитростей для правильного получения информации во всех веб-браузерах, но работа с HTML-таблицей DOM является стандартом W3, и использование jQuery здесь не дает вам никаких преимуществ.

В некоторых моих старых ответах я использовал код grid.getDataIDs() и для идентификаторов. Теперь я бы предложил вам следовать коду из ответа. Одно только замечание о подсетках и других рядах.

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') с которого мы начали. Вы можете изучить содержимое подсетки, как я описал ранее.

Другие вопросы по тегам