Как показать подсетку jqGrid только в определенных строках?

Я создал сетку с несколькими уровнями вложенной сетки, используя jqGrid. и с небольшой помощью этого ответа. Вот что у меня есть на данный момент:

Текущий статус сети

Я пытаюсь изменить его таким образом, чтобы показывать подсетку только в том случае, если есть данные для отображения. Другими словами, если count > 0. Логически я попытался добавить условие (псевдокод ниже, основанный на ранее упомянутом ответе):

Исходный код

var gridParams = {
    datatype: 'local',
    data: myGridData,
    colNames: ['Column 1', 'Column 2'],
    colModel: [
        { name: 'col1', width: 200 },
        { name: 'col2', width: 200 }
    ],
    ...
    subGrid: true,
    subGridRowExpanded: function (subgridDivId, rowId) {
        var subgridTableId = subgridDivId + "_t";
        $("#" + subgridDivId).html("<table id='" + subgridTableId + "'></table>");
        $("#" + subgridTableId).jqGrid({
            datatype: 'local',
            data: mySubgrids[rowId],
            colNames: ['Col 1', 'Col 2', 'Col 3'],
            colModel: [
                { name: 'c1', width: 100 },
                { name: 'c2', width: 100 },
                { name: 'c3', width: 100 }
            ],
            ...
        });
    }
}

$("#grid").jqGrid(gridParams);

Скорректированный код

var gridParams = {
    datatype: 'local',
    data: myGridData,
    colNames: ['Column 1', 'Column 2'],
    colModel: [
        { name: 'col1', width: 200 },
        { name: 'col2', width: 200 }
    ],
    ...
}

// Condition added HERE
if (count > 0)
{
    gridParams.subGrid = true;
    gridParams.subGridRowExpanded = function (subgridDivId, rowId) {
        var subgridTableId = subgridDivId + "_t";
        $("#" + subgridDivId).html("<table id='" + subgridTableId + "'></table>");
        $("#" + subgridTableId).jqGrid({
            datatype: 'local',
            data: mySubgrids[rowId],
            colNames: ['Col 1', 'Col 2', 'Col 3'],
            colModel: [
                { name: 'c1', width: 100 },
                { name: 'c2', width: 100 },
                { name: 'c3', width: 100 }
            ],
            ...
        });
    }
}

$("#grid").jqGrid(gridParams);

но это просто терпит неудачу:

введите здесь описание изображения

Это просто не поддерживается или я что-то не так делаю?


person Moslem Ben Dhaou    schedule 22.09.2015    source источник


Ответы (1)


Если я правильно понимаю ваш вопрос, вы хотите удалить значок «+» (развернуть подсетку) для строк, которые не имеют элементов во вложенной сетке. В этом случае вы можете следовать старому трюку, описанному в старом ответе. Вы можете добавить дескриптор loadComplete, который удаляет некоторые значки «+» из сетки с опцией subGrid: true. Вам нужно просто знать идентификаторы строк всех строк сетки, у которых нет подсетки, и сделать для строк

$("#" + rowid + ">td.sgcollapsed").unbind("click").html("");

ОБНОВЛЕНО: я опубликовал модификацию бесплатного jqGrid, которая позволяет легко внедрить требование без вышеуказанного взлома.

Демо демонстрирует новую функцию. Реализация очень проста. Он содержит обратный вызов hasSubgrid внутри subGridOptions. Обратный вызов имеет options, который является объектом со свойствами rowid, data и двумя менее важными свойствами iRow и iCol. Код демонстрации использует options.data, которые представляют данные строки. Демонстрация создает подсетку только в том случае, если входная строка имеет tax выше 20.

subGridOptions: {
    hasSubgrid: function (options) {
        return parseFloat(options.data.tax) > 20;
    }
}

Вы можете использовать mySubgrids[options.data.rowid].length в вашем случае, если я правильно понимаю формат ваших входных данных.

person Oleg    schedule 23.09.2015
comment
Я думал о том, чтобы не заполнять пустую сетку в первую очередь, но этот hgack полностью справляется с задачей! Спасибо! - person Moslem Ben Dhaou; 23.09.2015
comment
@MoslemBenDhaou: Я имею в виду также не заполнение подсетки. Вместо этого вы можете включить в родительскую сетку хак. Это предотвратит добавление значка + в строку родительской сетки, поэтому для строки никогда не будет заполнена подсетка. Кстати, я подготовил модификацию бесплатного jqGrid (форк jqGrid, который я разрабатываю, начиная с конец 2014 г.), который вводит обратный вызов hasSubgrid в subGridOptions. Обратный вызов сообщает jqGrid, в какие строки следует добавлять значок +, а в какие нет. Я скоро опубликую модификацию и сообщу вам. - person Oleg; 23.09.2015
comment
@MoslemBenDhaou: я разместил модификацию здесь. Таким образом, вы можете загрузить последний код с GitHub или использовать URL-адреса. - person Oleg; 23.09.2015
comment
@MoslemBenDhaou: я опубликовал ОБНОВЛЕННУЮ часть своего ответа с демонстрация, которая демонстрирует новую функцию бесплатного jqGrid. - person Oleg; 23.09.2015
comment
Отлично спасибо! тоже посмотрю :) - person Moslem Ben Dhaou; 25.09.2015
comment
@MoslemBenDhaou: Добро пожаловать! - person Oleg; 25.09.2015
comment
@ Олег 4 года спустя, и ваш хак для отвязки клика только что избавил меня от огромного количества выдергивания волос. Огромное спасибо! - person plum 0; 23.07.2019
comment
@plum0: Я рад, что старые сообщения все еще помогают. Спасибо, что написали комментарий! - person Oleg; 24.07.2019
comment
@Oleg Где я могу найти документацию о том, откуда взялась часть ">td.sgcollapsed"? В настоящее время я пытаюсь сделать условное определение, нужен ли пейджер, и ищу информацию о том, как это сделать. - person plum 0; 24.07.2019
comment
@plum0: я не могу следить за тобой. Прежде всего, какую версию jqGrid вы используете и от какой ветви jqGrid (бесплатный jqGrid, коммерческий Guriddo jqGrid JS или старый jqGrid в версии ‹=4.7)? Что вы имеете в виду под документацией внутренних структур, таких как ">td.sgcollapsed"? У jqGrid есть исходный код, и видно, что код js создает подсетку, используя такие классы, как ui-sgcollapsed, sgcollapsed и sgexpanded, и CSS тоже использует классы. - person Oleg; 24.07.2019