Tarayıcı yeniden boyutlandırıldığında jqGrid yeniden boyutlandırılsın mı?


Yanıtlar:


69

Bunu üretimde bir süredir herhangi bir şikayet olmadan kullanıyorum (Sitenize tam olarak bakmak için biraz ince ayar yapmak gerekebilir .. örneğin, bir kenar çubuğunun genişliğini çıkarmak, vb.)

$(window).bind('resize', function() {
    $("#jqgrid").setGridWidth($(window).width());
}).trigger('resize');

Bu durumda da çok kullanışlıdır: setGridWidth'in ikinci parametresi 'shrink'tir. stackoverflow.com/questions/7745009/…
Jim

Stephen, jmav'ın çözümünü gördün mü? Bu en iyisi gibi görünüyor ama bu yaklaşımla bunu nasıl karşılaştırdığınızı görmek istedim
IcedDante

53

Takip olarak:

Bu yazıda gösterilen önceki kod, güvenilmez olduğu için sonunda terk edildi. Şimdi, jqGrid belgelerinde önerildiği gibi ızgarayı yeniden boyutlandırmak için aşağıdaki API işlevini kullanıyorum:

jQuery("#targetGrid").setGridWidth(width);

Gerçek yeniden boyutlandırmayı yapmak için, aşağıdaki mantığı uygulayan bir işlev, pencerenin yeniden boyutlandırma olayına bağlıdır:

  • Izgaranın genişliğini üst öğesinin clientWidth'ini ve (bu mevcut değilse) offsetWidth niteliğini kullanarak hesaplayın.

  • Genişliğin x pikselden fazla değiştiğinden emin olmak için bir akıl sağlığı kontrolü yapın (uygulamaya özgü bazı sorunların üstesinden gelmek için)

  • Son olarak, ızgaranın genişliğini değiştirmek için setGridWidth () kullanın

Yeniden boyutlandırmayı işlemek için örnek kod:

jQuery(window).bind('resize', function() {

    // Get width of parent container
    var width = jQuery(targetContainer).attr('clientWidth');
    if (width == null || width < 1){
        // For IE, revert to offsetWidth if necessary
        width = jQuery(targetContainer).attr('offsetWidth');
    }
    width = width - 2; // Fudge factor to prevent horizontal scrollbars
    if (width > 0 &&
        // Only resize if new width exceeds a minimal threshold
        // Fixes IE issue with in-place resizing when mousing-over frame bars
        Math.abs(width - jQuery(targetGrid).width()) > 5)
    {
        jQuery(targetGrid).setGridWidth(width);
    }

}).trigger('resize');

Ve örnek işaretleme:

<div id="grid_container">
    <table id="grid"></table>
    <div id="grid_pgr"></div>
</div>

2
IE'yi desteklemeniz gerekiyorsa, zamanlayıcılar aracılığıyla yeniden boyutlandırma sıklığını azaltmak isteyebilirsiniz.
fforw

Detaylandırmak ister misin? Izgara genişliği değiştirilmeden yeniden boyutlandırma olayı çağrıldığında IE'de sorunlar yaşadım, bu da ızgaranın kendisinde garip davranışlara neden oldu. Kodun 2. adımdaki bir eşiği hesaba
katmasının

Jqgrid ekleme / düzenleme formu için css'yi değiştirmek istersem ne olur?
Bhavik Ambani

36

Otomatik yeniden boyutlandırma:

JQgrid 3.5+ için

        if (grid = $('.ui-jqgrid-btable:visible')) {
            grid.each(function(index) {
                gridId = $(this).attr('id');
                gridParentWidth = $('#gbox_' + gridId).parent().width();
                $('#' + gridId).setGridWidth(gridParentWidth);
            });
        }

JQgrid 3.4.x için:

       if (typeof $('table.scroll').setGridWidth == 'function') {
            $('table.scroll').setGridWidth(100, true); //reset when grid is wider than container (div)
            if (gridObj) {

            } else {
                $('#contentBox_content .grid_bdiv:reallyvisible').each(function(index) {
                    grid = $(this).children('table.scroll');
                    gridParentWidth = $(this).parent().width() – origami.grid.gridFromRight;
                    grid.setGridWidth(gridParentWidth, true);
                });
            }
        }

Eh, yukarıdaki 3.5+ sürümünün IE9'da jqGrid 4.4.1 ile harika çalıştığını doğrulayabilirim, ancak FireFox 16 ve 17 ile tarayıcı genişliğini her ayarladığımda tablo biraz daha genişlemeye devam ediyor.
MattSlay

Belki css'de tanımlanan sınırlarla ilgili sorunlarınız var - ben yaptım.
jmav

JqGrid'in son sürümlerinde setGridWidth () çağrınızın ikinci parametresi olarak muhtemelen true değerini iletmek isteyeceksiniz. Tablonuzdaki sütunlar, tablo yeniden boyutlandırıldığında yeniden boyutlandırılmaz. yani$(this).setGridWidth(gridParentWidth, true);
Josh Schumacher

8

bu benim için güzel çalışıyor gibi görünüyor

$(window).bind('resize', function() {
    jQuery("#grid").setGridWidth($('#parentDiv').width()-30, true);
}).trigger('resize');

Çözüm için teşekkürler, ancak tüm div'i değiştirdiği gibi düzgün çalışmadı, ancak başlık için geçerli değil. :(
Vikas Gupta

Örneğinizde neden -30 var?
Vasil Popov

Emin değilim. 5 yıl önceydi :(
Darren Cato

7

Düzen için 960.gs kullanıyorum, bu yüzden çözümüm aşağıdaki gibi:

    $(window).bind(
        'resize',
        function() {
                    //  Grid ids we are using
            $("#demogr, #allergygr, #problemsgr, #diagnosesgr, #medicalhisgr").setGridWidth(
                    $(".grid_5").width());
            $("#clinteamgr, #procedgr").setGridWidth(
                    $(".grid_10").width());
        }).trigger('resize');
// Here we set a global options

jQuery.extend(jQuery.jgrid.defaults, {
    // altRows:true,
    autowidth : true,
    beforeSelectRow : function(rowid, e) { // disable row highlighting onclick
        return false;
    },
    datatype : "jsonstring",
    datastr : grdata,  //  JSON object generated by another function
    gridview : false,
    height : '100%',
    hoverrows : false,
    loadonce : true,
    sortable : false,
    jsonReader : {
        repeatitems : false
    }
});

// Demographics Grid

$("#demogr").jqGrid( {
    caption : "Demographics",
    colNames : [ 'Info', 'Data' ],
    colModel : [ {
        name : 'Info',
        width : "30%",
        sortable : false,
        jsonmap : 'ITEM'
    }, {
        name : 'Description',
        width : "70%",
        sortable : false,
        jsonmap : 'DESCRIPTION'
    } ],
    jsonReader : {
        root : "DEMOGRAPHICS",
        id : "DEMOID"
    }
});

// Aşağıda tanımlanan diğer ızgaralar ...


5

Eğer sen:

  • var shrinkToFit: false(sabit genişlikte sütunlar)
  • Sahip olmak autowidth: true
  • sıvı yüksekliği umrumda değil
  • yatay kaydırma çubuğuna sahip

Aşağıdaki stillerle değişken genişlikte ızgara yapabilirsiniz:

.ui-jqgrid {
  max-width: 100% !important;
  width: auto !important;
}

.ui-jqgrid-view,
.ui-jqgrid-hdiv,
.ui-jqgrid-bdiv {
   width: auto !important;
}

İşte bir demo


4

Bağlantınızdaki koddan ödünç alarak şuna benzer bir şey deneyebilirsiniz:

$(window).bind('resize', function() { 
    // resize the datagrid to fit the page properly:
    $('div.subject').children('div').each(function() {
        $(this).width('auto');
        $(this).find('table').width('100%');
    });
});

Bu şekilde, aslında sorunuzdan istediğiniz gibi görünen window.onresize olayına doğrudan bağlanırsınız.

Izgaranız% 100 genişliğe ayarlıysa, kapsayıcı genişlediğinde otomatik olarak genişlemesi gerekse de, kullandığınız eklentide bilmediğim bazı karmaşıklıklar olmadıkça.


Bahşiş için teşekkürler! GridComplete olayından yeniden boyutlandırma kodunu çağırdığım ortaya çıktı - her ne sebeple olursa olsun bu IE'de çalışmıyor. Her neyse, yeniden boyutlandırma kodunu ayrı bir işleve çıkardım ve hem yeniden boyutlandırma işlevinde hem de ızgara oluşturulduktan sonra çağırdım. Tekrar teşekkürler!
Justin Ethier

Sanırım IE 8'de bir pencereyi yeniden boyutlandırırken bu işe yaramıyor. Yine de sayfayı yenilediğinizde yapar.
SoftwareSavant

3

Ana cevap benim için çalıştı ancak uygulamayı IE'de son derece tepkisiz hale getirdi, bu yüzden önerildiği gibi bir zamanlayıcı kullandım. Kod şuna benzer ( $(#contentColumn)JQGrid'in bulunduğu div'dir):

  function resizeGrids() {
    var reportObjectsGrid = $("#ReportObjectsGrid");
    reportObjectsGrid.setGridWidth($("#contentColumn").width());
};

var resizeTimer;

$(window).bind('resize', function () {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(resizeGrids, 60);
});

Zamanlayıcının düzgün çalışması zor olacak gibi görünüyor. Lütfen güncellenmiş cevabıma bir göz atabilir ve zamanlayıcıya hala ihtiyacınız olup olmadığını görebilir misiniz?
Justin Ethier

1
Sadece üçünü de karşılaştırdım. Sizinki kesinlikle Stephens çözümüne göre bir gelişme, ancak pencerenin yeniden boyutlandırılması hala oldukça sarsıntılı. Zamanlayıcı ile yeniden boyutlandırma, etkinlik tetiklenene kadar sorunsuzdur, bu nedenle zamanlama tetikleme süresini doğru ayarlamak için biraz uğraşmak gerekir. Zamanlayıcı biraz sakar, ama sonunda en iyi sonuçları verdiğini düşünüyorum.
2011'de

düzenleme: Stephens sln benim başka bir sayfamda iyi çalışıyor ... bu sayfa ancak bir sürü başka jQueryUI kontrolü ekledikten sonra zorlanmaya başladı.
woggles

Bu çok aptalca bir soru. Ama ben Jquery'de tam bir HİÇBİR değilim, bu yüzden lütfen çok bağışlayıcı, ama tüm bu işlevleri nereye yerleştiriyoruz? Jquery'nin içinde (belge) .ready (function () {} yoksa onu dışarı mı çıkarıyoruz? Ayrıca, merak ediyorum, ayrıca, $ (pencere) ve genişliğin nereden geldiğini merak ediyorum
SoftwareSavant

@DmainEvent, $ (window) .bind'i $ (Document) .ready içine ve reszieTimer var ve resizeGrids fonksiyonunu $ (Document) .ready'nin dışında koydum. $ (window), jquery'de yerleşik olan pencere öğesidir ve .width (), bir öğenin genişliğini hesaplayan bir jquery işlevidir
2011'de

3

Merhaba Stack overflow meraklıları. Cevapların çoğundan hoşlandım ve hatta bir çifte yukarı oy verdim, ancak hiçbiri garip bir nedenle IE 8'de benim için çalışmadı ... Ancak bu bağlantılarla karşılaştım ... Bu adam, görünen bir kitaplık yazdı iş. Bunu jquery kullanıcı arayüzüne ek olarak projelerinize dahil edin, tablonuzun ve div'inizin adını yazın.

http://stevenharman.net/blog/archive/2009/08/21/creating-a-fluid-jquery-jqgrid.aspx

http://code.google.com/p/codeincubator/source/browse/#svn%2FSamples%2Fsteveharman%2FjQuery%2Fjquery.jqgrid.fluid%253Fstate%253Dclosed


Ayrıca IE8'de uyumluluk görünümü olan ve olmayan bazı garip davranışlar alıyorum: /
Izgaram

1
autowidth: true

benim için mükemmel çalıştı. buradan öğrendim .


2
autowidthızgara ilk yüklendiğinde iyi çalışır, ancak tarayıcı yeniden boyutlandırıldığında ızgarayı yeniden boyutlandırmaz. Bu problemle nasıl başa çıktınız yoksa bu sizin için bir gereklilik değil mi?
Justin Ethier

@Justin Ethier: haklısın. Tarayıcı yeniden boyutlandırıldığında değil, kılavuzun ilk kez yüklendiğinde ayarlanmasını istedim. Üzgünüm soruyu yanlış anladım. Olumsuz oyu anlıyorum.
understack

1

Bu çalışıyor..

var $targetGrid = $("#myGridId");
$(window).resize(function () {
    var jqGridWrapperId = "#gbox_" + $targetGrid.attr('id') //here be dragons, this is     generated by jqGrid.
    $targetGrid.setGridWidth($(jqGridWrapperId).parent().width()); //perhaps add padding calculation here?
});

0
<script>
$(document).ready(function(){    
$(window).on('resize', function() {
    jQuery("#grid").setGridWidth($('#fill').width(), false); 
    jQuery("#grid").setGridHeight($('#fill').height(),true); 
}).trigger('resize');      
});
</script>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.