jqgrid вложенная подсетка Подсетка 4-го уровня всегда возвращает первый rowid подсетки

jqGrid v4.3.2
ie9
win7enterprise

Я использую следующий код для генерации подсеток:

http://www.trirand.com/blog/jqgrid/jqgrid.html -> Advanced -> Grid as SubGrid

Я делаю это, и у меня есть

Подсетка 1-го уровня ОК
Подсетка 2-го уровня ОК
Подсетка 3-го уровня ОК
Подсетка 4-го уровня Загружает подсеть OK для каждой строки третьего уровня sg, но показывает только данные первого идентификатора строки третьего уровня sg

Когда я проверяю инструменты разработчика, я вижу, что запрос всегда отправляет идентификатор первой строки третьей подсетки, я знаю, как добавить пользовательские параметры с postData, который я уже попробовал, а также этот ответ от Олега K postData для подсетки в jqgrid не работает? (в моем случае это не работает, данные не добавляются в запрос)

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

subGridRowExpanded  //always returns first row id of the third grid
onSelectRow  //doesn't fire if we click the + icon for expanding the subgrid
beforeSelectRow  //doesn't fire at all

Другое странное поведение заключается в том, что, если я щелкаю по любой строке в подсетке третьего уровня, выбирается только первая строка.

Нет, использование TreeGrid не вариант, извините.

Я подумываю о том, чтобы связать событие click со значком плюса (первая ячейка) каждой строки подсетки 3-го уровня и запустить команду expandSubGridRow, но остается вопрос, как мне получить идентификатор строки, по которой я щелкнул третий уровень подсетка?

С уважением и заранее спасибо, любая помощь высоко ценится.

jQuery("#listsg11").jqGrid({
    url:'server.php?q=1',
    datatype: "xml",
    height: 190,
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
    colModel:[
        {name:'id',index:'id', width:55},
        {name:'invdate',index:'invdate', width:90},
        {name:'name',index:'name', width:100},
        {name:'amount',index:'amount', width:80, align:"right"},
        {name:'tax',index:'tax', width:80, align:"right"},      
        {name:'total',index:'total', width:80,align:"right"},       
        {name:'note',index:'note', width:150, sortable:false}       
    ],
    rowNum:8,
    rowList:[8,10,20,30],
    sortname: 'id',
    viewrecords: true,
    sortorder: "desc",
    multiselect: false,
    subGrid: true,
    caption: "Grid as Subgrid",
    subGridRowExpanded: function(subgrid_id, row_id) {
        var subgrid_table_id;
        subgrid_table_id = subgrid_id+"_t";
        $("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table>");
        jQuery("#"+subgrid_table_id).jqGrid({
            url:"subgrid.php?q=2&id="+row_id,
            datatype: "xml",
            colNames: ['No','Item','Qty','Unit','Line Total'],
            colModel: [
                {name:"num",index:"num",width:80,key:true},
                {name:"item",index:"item",width:130},
                {name:"qty",index:"qty",width:70,align:"right"},
                {name:"unit",index:"unit",width:70,align:"right"},
                {name:"total",index:"total",width:70,align:"right",sortable:false}
            ],
            subGrid: true,
            caption: "Grid as Subgrid",
            subGridRowExpanded: function(subgrid_id2, row_id2) {
                var subgrid_table_id2;
                subgrid_table_id2 = subgrid_id2+"_t";
                $("#"+subgrid_id2).html("<table id='"+subgrid_table_id2+"' class='scroll'></table>");
                jQuery("#"+subgrid_table_id2).jqGrid({
                    url:"subgrid.php?q=3&id="+row_id2,
                    datatype: "xml",
                    colNames: ['No','Item','Qty','Unit','Line Total'],
                    colModel: [
                        {name:"num",index:"num",width:80,key:true},
                        {name:"item",index:"item",width:130},
                        {name:"qty",index:"qty",width:70,align:"right"},
                        {name:"unit",index:"unit",width:70,align:"right"},
                        {name:"total",index:"total",width:70,align:"right",sortable:false}
                ],
                subGrid: true,
                caption: "Grid as Subgrid",
                subGridRowExpanded: function(subgrid_id3, row_id3) {
                    var subgrid_table_id3;
                    subgrid_table_id3 = subgrid_id3+"_t";
                    $("#"+subgrid_id3).html("<table id='"+subgrid_table_id3+"' class='scroll'></table></div>");
                    jQuery("#"+subgrid_table_id3).jqGrid({
                        url:"subgrid.php?q=4&id="+row_id3,
                        datatype: "xml",
                        colNames: ['No','Item','Qty','Unit','Line Total'],
                        colModel: [
                            {name:"num",index:"num",width:80,key:true},
                            {name:"item",index:"item",width:130},
                            {name:"qty",index:"qty",width:70,align:"right"},
                            {name:"unit",index:"unit",width:70,align:"right"},
                            {name:"total",index:"total",width:70,align:"right",sortable:false}
                    ]
                    });
                }
                });
            }
        });
    }
});

1 ответ

Решение

Я все еще предполагаю, что у вас есть некоторые конфликты идентификаторов между * данными во * всех ** подсетях, отображаемых на странице. Например, если вы вставляете на некотором уровне в некоторые из открытых сеток данные, имеющие "1" в качестве строки, то никакие другие данные в любой подсетке не должны вставляться с той же подсеткой.

Для понимания: вы используете key:true для "num" столбец на всех уровнях подсеток. Соответствующее значение будет использоваться не только в "num" столбец внутри ячейки сетки (внутри <td>here</td>). Он также будет использоваться в качестве значения id атрибуты строки сетки или подсетки (<tr>). HTML не допускает дублирование идентификатора на странице. Таким образом, если вы вставляете элементы с дубликатами идентификаторов, вы можете получить странные эффекты, которые могут отличаться в разных браузерах. Например, вы попытаетесь выбрать одну строку, а будет выбрана другая. Вы также можете столкнуться с гораздо более сложными проблемами при выборе строк. Таким образом, вы должны заполнить сетки, чтобы идентификаторы были уникальными на всей странице.

Чтобы убедиться, что проблема с идентификаторами дубликатов не существует, вы можете использовать idPrefix вариант. На уровне 0 вы можете использовать

idPrefix: "m"

(от основного) например. Для подсетки на следующем уровне вы можете использовать

idPrefix: "s" + row_id + "_"

для подсетки следующего уровня

idPrefix: "s" + row_id + "_" + row_id2 + "_"

а также

idPrefix: "s" + row_id + "_" + row_id2 + "_" + row_id3 + "_"

Определение jQuery("#"+subgrid_table_id3) находится внутри subGridRowExpanded подсеток всех предыдущих уровней. Таким образом, вы можете получить доступ row_id а также row_id2 определено на внешнем объеме.

Я надеюсь, что после изменений у вас не возникнет никаких странных проблем, таких как проблемы, которые вы описали.

вот образец дубликатов

3-я сетка, когда вы нажимаете, чтобы показать четвертую сетку

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