Подтвердить что ты не робот

Согласованные заголовки сетки с Flexigrid?

Итак, я пытаюсь использовать плагин flexigrid. Похоже, что он будет отлично работать в стороне от того, что похоже, что вам нужно вручную установить ширину столбца. В противном случае заголовки столбцов не совпадают с столбцами тела.

Существует ли какой-либо способ автоматического сопоставления этих значений, но при этом разрешается определять ширину столбцов по длине содержимого в столбцах (как и обычное поведение таблицы).

4b9b3361

Ответ 1

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

grid.flexigrid({

  ...other setup...

  onSuccess: function() {
       format();
    });
  }
});

function format() {
    var gridContainer = this.Grid.closest('.flexigrid');
    var headers = gridContainer.find('div.hDiv table tr:first th:not(:hidden)');
    var drags = gridContainer.find('div.cDrag div');
    var offset = 0;
    var firstDataRow = this.Grid.find('tr:first td:not(:hidden)');
    var columnWidths = new Array( firstDataRow.length );
    this.Grid.find( 'tr' ).each( function() {
        $(this).find('td:not(:hidden)').each( function(i) {
            var colWidth = $(this).outerWidth();
            if (!columnWidths[i] || columnWidths[i] < colWidth) {
                columnWidths[i] = colWidth;
            }
        });
    });
    for (var i = 0; i < columnWidths.length; ++i) {
        var bodyWidth = columnWidths[i];

        var header = headers.eq(i);
        var headerWidth = header.outerWidth();

        var realWidth = bodyWidth > headerWidth ? bodyWidth : headerWidth;

        firstDataRow.eq(i).css('width',realWidth);
        header.css('width',realWidth);            
        drags.eq(i).css('left',  offset + realWidth );
        offset += realWidth;
    }
}

Ответ 2

У меня тоже была эта проблема. Вот мое исправление, и оно отлично работает. В flexigrid.js по строке 678 измените эту строку.

$(tdDiv).css({textAlign:pth.align,width: $('div:first',pth)[0].style.width});

к этому

$(tdDiv).css({textAlign:pth.align,width: $('div:first',pth).width() + "px"});

И вы все настроены.

Ответ 3

Мое решение намного проще, чем другие.

Прежде чем вызвать функцию flexigrid, добавьте следующее:

$("#yourtable th").each(function() {
  $(this).attr("width", $(this).width());
});

Это приведет к тому, что ширина заголовков столбцов будет такой же широкой, как текст в них (в отличие от ручной установки каждой ширины заголовка либо с помощью css, либо в разметке) и сделать столбцы тела таблицы одинаковыми.

Ответ 4

Я получил это, чтобы работать (по крайней мере частично). Проблема, с которой я столкнулся в своей предыдущей итерации (которая также была связана с реализацией tvanfosson), заключалась в том, что после изменения размеров заголовков бары перетаскивания не будут выравниваться с новыми ширинами столбцов.

Моя текущая реализация приведена ниже, которая работает в Firefox 3.5 и Chrome. К сожалению, в IE (все версии) есть какое-то исключение, которое довольно сбивает с толку. Я буду отлаживать дальше в понедельник:

$(".flexigrid").each(function() {
    var grid = $(this);
    var headers = grid.find(".hDiv thead th");
    var row = grid.find(".bDiv tbody tr:first");
    var drags = grid.find("div.cDrag div");
    if (row.length >= 1) {
        var cells = row.find("td");
        var offsetAccumulator = 0;
        headers.each(function(i) {
            var headerWidth = $(this).width();
            var bodyWidth = cells.eq(i).width();
            var realWidth = bodyWidth > headerWidth ? bodyWidth : headerWidth;

            $(this).width(realWidth);
            cells.eq(i).width(realWidth);

            var drag = drags.eq(i);
            var dragPos = drag.position();
            var offset = (realWidth - headerWidth);
            var newPos = dragPos.left + offset + offsetAccumulator;
            offsetAccumulator += offset;
            drag.css("left", newPos);
        });
    }
});

Ответ 5

Спасибо. Основываясь на позиции линии 678, моя была исправлена ​​следующим образом:

$(tdDiv).css({textAlign:pth.align,width: $('div:first',pth).width()-10 + "px"});

По какой-то причине шрифт заголовка больше шрифта детали... надеюсь, что это поможет.

Ответ 6

Из вашего собственного ответа я добавил настройку min-width, чтобы столбцы не сжимались по-другому, если ширина flexigrid была слишком узкой или flexigrid изменена, проверена только в chrome:

    $(this).width(realWidth);
    cells.eq(i).width(realWidth);
    // these two lines added
    $(this).css('min-width', realWidth);
    cells.eq(i).css('min-width',realWidth);

Просто выполните это изменение размера столбца, так как это изменяет ширину div внутри th и td, но это может быть исправлено с несколькими дополнительными строками в flexigrid в функции "dragEnd":

. . .
// LINE 211
$('th:visible div:eq(' + n + ')', this.hDiv).css('width', nw);
// ADD THIS AFTER LINE 211
$('th:visible div:eq(' + n + ')', this.hDiv).parent().css('min-width', nw);
$('th:visible div:eq(' + n + ')', this.hDiv).parent().css('width', nw);
. . .
// LINE 214
$('td:visible div:eq(' + n + ')', this).css('width', nw);
// ADD THIS AFTER LINE 214
$('td:visible div:eq(' + n + ')', this).parent().css('width', nw);
$('td:visible div:eq(' + n + ')', this).parent().css('min-width', nw);

Ответ 7

Аналогичная проблема для меня. У вас есть страница с 3 вкладками, каждая с гибким. Только одна из вкладок имела проблему, когда ячейка заголовка была чем-то короче, чем ячейки данных под ней. Который также сорвал выравнивание всех ячеек заголовка после этого.

.. то, что я выяснил, проверив визуализированные элементы с помощью функции Chrome CTRL + SHIFT + J и проверив внутри элемента <div class="hDiv"... в конечном итоге найти поле <th abbr="MyColumnName"... было то, что width: <nnn>px части даже не было!

Вернулся и осмотрел, где я определял colModel и заметил только один столбец... вместо width: <MyWidthValueHere>, вместо этого я случайно набрал width: <MyWidthValueHere>, (первые буквы пробелов и все строчные буквы). Это была такая тонкая разница, что мои глаза не улавливали ее, когда сначала изучали и сравнивали/контрастировали вкладки, которые работали против этого, у которого была проблема.

Ответ 8

Я столкнулся с тем же, выяснив, что ширина моих divs, содержащих заголовки столбцов и ячейки таблицы, имела ширину = 0. Поэтому мне пришлось немного подождать, пока не будет создана целая html-таблица, тогда я должен был запустить метод "формат". Следующая вещь в том, что у меня есть таблица HTML, встроенная в невидимый div в начале. Поэтому я должен был опустить селектор not(:hidden) в своем коде.

Здесь мы идем:

    $.fn.flexAddData = function(data) { // function to add data to grid
       ...
    };
    // my own method to justify the column headers with the body
    $.fn.flexFormat = function() {
        return this.each(function() {
            var gridContainer = $('.flexigrid');
            var headers = gridContainer.find('.hDiv table tr:first th');
            var firstDataRow = gridContainer.find('.bDiv table tr:first td');
            var offSet = 10;
            // for each element in headers
            // compare width with firstDataRow elemts
            // the greater one sets the width of the lower one
            $.each(headers, function(i) {
                var thWidth = $(this).find('div').outerWidth();
                var tdWidth = $(firstDataRow[i]).find('div').outerWidth();

                thWidth > tdWidth ? $(firstDataRow[i]).find('div').width(thWidth - offSet) : $(this).find('div').width(tdWidth - offSet);

            });
        });
    }; // end format

Вызов метода следующим образом:

    setTimeout(function() {
            $('.flexigrid').flexFormat();
        }
        , 10
    );

Надеюсь, что у вас будет другое решение проблемы;-) С уважением, Кристоф

Ответ 9

Обнаружено это в другом месте:

Выяснил это - для тех, у кого есть аналогичная проблема: мне было присвоено до <div id="mygrid">, когда я назначил его <table id="mygrid">все отлично поработало!

http://markmail.org/message/kibcuxu3kme2d2e7

Ответ 10

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

У меня была компоновка жидкости с тремя колоннами. Я переместил сетку на самую верхнюю часть страницы, сразу после тега тела, и она отлично выстроилась! Вау...

Ответ 11

Это работало для меня:

    onSuccess : function(){
         $('#flex1 > tbody').wrap('<table cellpadding="0" cellspacing="0" />');
    },

Добавьте это в опции построения flexgrid. flex1 - ваш идентификатор div flex flex.

Моше.

Ответ 12

Этот код отлично работает в моем проекте. Это похоже на другие ответы.

$("#my_table").flexigrid({
    ...
    onSuccess: function(){
        columnWidth();
        $(window).resize(function(){
            columnWidth();
        });
    }
});

function columnWidth(){
    var num_col = 0;
    //Work with the columns width of the first row of body
    $("#row1 td").each(function(td){
        //row column width greater than header column width 
        if($(this).width() > $("th[axis='col"+num_col+"']").width()){
            $("th[axis='col"+num_col+"']").width($(this).width());
            $("th[axis='col"+num_col+"']").css({"min-width":$(this).width()});
        }
        //header column width greater than row column width
        else if($("th[axis='col"+num_col+"']").width() > $(this).width()){
            $("td[abbr='"+$(this).prop('abbr')+"']").width($("th[axis='col"+num_col+"']").width());
            $("td[abbr='"+$(this).prop('abbr')+"']").css({"min-width":$("th[axis='col"+num_col+"']").width()});
        }
        ++num_col;
    });
}

Надеюсь, это решило ваши проблемы.