Вкладки пользовательского интерфейса jqGrid и JQuery, отображающие сетки, развернутые только на основной вкладке (div)

Я добавил несколько сеток (jqgrid) в объект вкладок пользовательского интерфейса jQuery. Все сетки на дочерних вкладках, которые развернуты по умолчанию, отображаются отлично. Но сетки на дочерних вкладках, которые НЕ расширены по умолчанию, постоянно показывают маленькую jqGrid (jqgrid с autowidth=true). Любые идеи?

Спасибо!

См. http://www.revolucion7.com/wp-content/uploads/2009/10/jqgridp1.JPG

Другими словами...

У меня есть две вкладки на странице с jqgrids на каждой.

У обоих jqgrids установлено свойство autowidth, проблема в том, что когда страница загружается, первая сетка настраивается на размер контейнера, но когда я щелкнул вторую вкладку, вторая сетка не настраивается на размер контейнера.


person neuling_listener    schedule 22.01.2010    source источник


Ответы (4)


Как вы инициализируете jqGrids на других вкладках? Вы должны инициализировать их, когда вкладка отображается с помощью события show, например:

jQuery(document).ready(function() {
 var initialized = [false, false];
 jQuery('#tabs').tabs({show: function(event, ui) {
                   if (ui.index == 0 && !initialized[0]){
                      // Initialize grid on second tab page here...
                      jQuery(NOMBRE_GRID).jqGrid({
                          url: '/Idiomas/DatosGrid/',
                          datatype: 'json',
                          mtype: 'GET',
                          height: 'auto',
                          multiselect: true,
                          autowidth: true,           
                          colNames: ['Id',  'Nombre'],
                          colModel: [
                                    { name: 'id_idioma', index: 'id_idioma', width: 100, align: 'left',
                                        formatter: 'showlink', formatoptions: { baseLinkUrl: '/Idiomas/', showAction: 'Edit', addParam: '' }
                                    },
                                    { name: 'nombre', index: 'nombre', width: 100, align: 'left' }
                                ],
                          pager: jQuery(NOMBRE_AREA_PAGINACION),
                          rowNum: tamanoPagina,
                          rowList: [5, 10, 15, 20],
                          sortname: 'nombre',
                          sortorder: “asc”,
                          viewrecords: true,           
                          caption: 'Idiomas'
                      }).navGrid(NOMBRE_AREA_PAGINACION, { edit: false, add: false, del: false, refresh: false, search: false });
                   });


                  } else if (ui.index == 1 && !initialized[1]){
                      // Initialize grid on second tab page here...
                      jQuery(NOMBRE_GRID_SELECCIONADOS).jqGrid({
                          url: '/Idiomas/DatosGrid/',
                          datatype: 'json',
                          mtype: 'GET',
                          height: 'auto',
                          multiselect: true,
                          autowidth: true,           
                          colNames: ['Id',  'Nombre'],
                          colModel: [
                                    { name: 'id_idioma', index: 'id_idioma', width: 100, align: 'left',
                                        formatter: 'showlink', formatoptions: { baseLinkUrl: '/Idiomas/', showAction: 'Edit', addParam: '' }
                                    },
                                    { name: 'nombre', index: 'nombre', width: 100, align: 'left' }
                                ],
                          sortname: 'nombre',
                          sortorder: “asc”,
                          viewrecords: true,           
                          caption: 'Idiomas'
                      });

                   initialized[ ui.index ] = true;
});

Если вы используете этот подход, вам также нужно будет отслеживать, когда инициализируется каждая сетка, поэтому вы не пытаетесь создать ее во второй раз, если пользователь щелкает другую вкладку, а затем возвращается к предыдущей.

person Justin Ethier    schedule 22.01.2010
comment
Привет Джастин! Спасибо за ответ :-) см. код в качестве примера на trirand.com/blog/?page_id=393/help/ - person neuling_listener; 22.01.2010
comment
Я обновил свой ответ соответственно. Это решает проблему? - person Justin Ethier; 22.01.2010
comment
да. работай на меня... Спасибо. Теперь, как можно обновить 2-ю или 3-ю вкладку при нажатии на первой вкладке? Спасибо - person neuling_listener; 05.05.2010
comment
Почему вы хотите обновить вкладку, которая не видна? - person Justin Ethier; 05.05.2010
comment
Я думаю, вам повезет больше, если вы обновите вкладку после того, как она станет видимой. Но вы можете попробовать обновить невидимые вкладки — просто убедитесь, что вы делаете это после инициализации сетки. Так, например, в событии show для первой вкладки вы, вероятно, могли бы просто поместить туда свой код... - person Justin Ethier; 07.05.2010
comment
Решение идеальное. Но событие show не работает с последней версией jquery выше 1.10. - person Gopi; 13.07.2016

Иногда вы не хотите инициализировать jqgrid в событии show, так как все ваши данные похожи и могут быть получены одним запросом. В этом случае вы можете установить ширину всех jqgrids на ширину видимой

var tab_width = $("#tabs div.ui-tabs-panel:not(.ui-tabs-hide)").width();

Затем установите для параметра ширины каждого jqgrid это значение при инициализации.

person Sonny    schedule 12.04.2012
comment
Вау! Какое чистое и простое решение! Я протестировал настройку «width: tab_width» и работал как шарм. Мне нравится :D Спасибо. - person Diosney; 24.08.2012

На самом деле, вы можете сделать это проще, добавив изменение размера в событие Tab Show:

$( '#tabs' ).tabs({ show: function(event, ui) { 
  if (grid = $('.ui-jqgrid-btable:visible')) {
    grid.each(function(index) {
      gridId = $(this).attr('id');
      gridParentWidth = $('#gbox_' + gridId).parent().width();
      $('#' + gridId).setGridWidth(gridParentWidth);
    });
  }
}});
person Alex Frenkel    schedule 01.02.2012

Я думаю, что это возможный дубликат с этот вопрос

Готов поспорить, что через три года после того, как был задан этот вопрос, эта проблема будет исправлена, но я вижу, что это не так :). Я думал об обновлении ответа Джастина выше, но в конце концов решил оставить его в целях совместимости с предыдущими версиями, если я нарушаю какие-либо правила форума, сообщите мне, и я обновлю ответ выше.

Из-за изменений в jQueryUI событие show теперь устарело и должен быть переименован в activate, а также с новый API ui.index теперь заменен на ui.newTab.index() для activate и на ui.tab.index() для create.

Я также обнаружил, что мне нужно привязать функцию к событию create, чтобы поместить сетку на первую вкладку.

Подводя итог, вот обновленная версия кода Джастина выше, надеюсь, это поможет, это сработало для меня:

var initialized = [false,false,false];
$( "#tabs" ).tabs({
  create:function(event,ui){
    var mytabindex = ui.tab.index()
    if (mytabindex == 0 && !initialized[0]){
       $("#grid0").jqGrid({
          ...   
          autowidth:true,
          ...  
       });
    }
    initialized[ mytabindex ] = true;
  },
  activate: function(event, ui) {
    var mytabindex = ui.newTab.index()
    if (mytabindex == 1 && !initialized[1]){
      $("#grid1").jqGrid({
         ...    
         autowidth:true,
         ...  
      });
    }
    else if (mytabindex == 2 && !initialized[2]){
      $("#grid2").jqGrid({
         ...    
         autowidth:true,
         ...
      });
    }
  initialized[ mytabindex ] = true;
  }
});
person Jose R    schedule 17.03.2013