Возможна ли переменная rowheight в SlickGrid? - PullRequest
25 голосов
/ 10 мая 2010

Я хотел бы указать переменную высоту строки в зависимости от размера содержимого. это возможно в Slickgrid?

Можете ли вы указать мне на какие-либо примеры?

Ответы [ 10 ]

14 голосов
/ 16 июля 2010

Это возможно, но это не тривиально, и вы, скорее всего, понесете штраф за производительность. Как работает SlickGrid, он должен быстро ответить на два следующих вопроса:

  • Для данной строки X, какое верхнее смещение для этой строки?
  • Для данного смещения Y, какая строка с этим смещением?

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

Вот примерно то, что я изменил в Slick.Grid.js

  • Добавить новый массив для отслеживания размеров строк. Инициализируйте все строки размером по умолчанию
  • Удалить правила css в createCssRules, которые устанавливают высоту ячейки
  • Добавьте некоторый код в конец renderRows, который проверяет визуализированную высоту каждой ячейки в строке, а затем устанавливает максимальную высоту всех ячеек (и сохраняет высоту в массиве размеров строк). Вам также необходимо отрегулировать верхнее смещение на основе суммы высот строк над текущей.
  • Добавить код в конец рендера, чтобы изменить размер холста до суммы всех высот строк.
  • Обновите getViewport, чтобы он возвращал верхнюю и нижнюю строки на основе сумм высот строк.
  • Есть несколько других мест, где используется options.rowHeight. Вы можете игнорировать некоторые из них, но, по крайней мере, везде, где изменен размер холста, необходимо изменить.

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

Надеюсь, это поможет.

4 голосов
/ 15 августа 2013

Я реализовал это в своем проекте с помощью ответа @Stephen Robinson здесь.
Если кому-то интересно, они могут проверить:
https://github.com/vihari/Seaview/blob/version3.0/SlickGrid-master/slick.grid.js.
Его можно включить с помощью приведенного выше файла, если для параметра options.enableWrap установлено значение true.
Спасибо.

3 голосов
/ 23 января 2013

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

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

Ключ в том, что я заново создаю сетку с новым значением rowHeight, установленным в настройках.

  1. Включите пользовательский интерфейс jQuery:
  2. Создать элементы для ползунка и значение
  3. Убедитесь, что ваша сетка настроена и инициализирована для загрузки страницы.
  4. Добавьте код для обработки ползунка и воссоздания сетки (в качестве альтернативы вы можете переместить то, что у меня есть в функции «слайд», в функцию «стоп», если вы не хотите перерисовывать каждый скользящий тик). ):

    $j( "#resizeRowSlider" ).slider({
          range:"min"
        , min: 50
        , max: 200
        , value: 50
        , create: function( even, ui ) {
            $j("rowResizeValue").html( "50" );
        }
        , slide: function( event, ui ) {
            $j( "rowResizeValue" ).html( ui.value );
    
            options.rowHeight = ui.value;
    
            // I do a manual resize; you could use autoHeight:true in grid options
            resizeGrid();
    
            grid = new Slick.Grid("#" + gridElemId, json, columns , options);
            grid.setSelectionModel(new Slick.RowSelectionModel() );
    
            refreshGrid(); // Handle invalidate, resizeCanvas
        }
        , stop: function( event, ui ) {
        }
    });
    

Кроме того, я должен отметить, что это не для каждой строки, но опять же, это соответствует моим потребностям на данный момент. Это не идеально, но это работает. Кроме того, если вам действительно нужно визуализировать сетку в первый раз без какого-либо переполнения, вы можете создать скрытый div, когда вы получите нужный текст и добавите display:table-cell, затем получите высоту div и установите это значение для параметров сетки для rowHeight. , Затем создайте (или заново создайте) сетку.

2 голосов
/ 24 сентября 2013

Существует также реализация переменной высоты с помощью JLynch7 на github:

https://github.com/JLynch7/SlickGrid/tree/variableRowHeight

Насколько я понимаю, высота задается пользователем и не рассчитывается автоматически на основе содержимого ячеек строки (я только посмотрел на пример / example-variable-row-height-dataview.html)

2 голосов
/ 11 мая 2010

Просто и понятно, это не поддерживается в SlickGrid и, вероятно, никогда не будет. К сожалению.

1 голос
/ 27 ноября 2014

Таким образом, ни один из них не является официальным, поддерживаемым и готовым к производству. Даже опция doby-grid (более поддерживаемая) по-прежнему указана как не готовая к работе.

Обратите внимание, есть также различия между:

  • Высота ряда может быть изменена отдельно для каждого ряда.
  • Текст может быть перенесен на следующую строку.
  • Высота строки может автоматически настраиваться в соответствии с содержимым.

Удивительно, но со всеми приведенными выше вариантами SlickGrid (и многими другими библиотеками DataGrid) вы можете получить один или два из вышеперечисленных, но не все три.

Если вас не очень волнуют официальные, поддерживаемые и готовые к работе версии, то это мои впечатления от тестирования трех вариантов SlickGrid, перечисленных выше:

Вид на море

  • Пользователи сообщают о проблемах с отображением только белого цвета, не тестируются с ячейками редактирования (предупреждение), разбиение на страницы может не работать (предупреждение).
  • Мой тест демонстрации показал, что он обернул текст и автоматически изменил высоту ячейки, но есть ошибка, что строки / границы отключены на несколько пикселей. Так что может быть полезным, но не готовым к производству.
  • Я пытался загрузить и использовать его. У него есть перенос текста в ячейках - хорошо. Его автоматическая регулировка высоты ячейки очень разбита / неполна, что делает перенос текста практически бесполезным (если вы не исправите высоту строки - не очень). Я частично исправил автоматическую настройку высоты ячеек, но мне нужно проделать еще немного работы. Не простая задача. Не работает из коробки. Определенно не готов к производству.

JLynch7

  • Нет демоверсии для запуска без загрузки.
  • Я пытался загрузить и использовать его. Он глючит (мне пришлось исправить это, чтобы он заработал), добавляет переменную высоту строки, но, похоже, НЕ переносит текст и НЕ автоматически регулирует высоту строки на основе текста !. Это не активно поддерживается. И не очень популярный, поэтому не очень хорошо поддерживаемый. Вид на море кажется более продвинутым, хотя его функция «Автоматическая настройка высоты строки» не работает.

Доби-сетка

  • Находится в альфа - не готов к производству. Похоже на значительную вилку - много изменений.
  • Я попробовал это. Начало работы сбивает с толку, но все заработало. Требуется дротик и требуется JS.
  • options.resizableRows - это половина того, что мы хотим - вы можете динамически изменять высоту строк. НО нет автоматического изменения размера строк, чтобы соответствовать содержанию !! ?? !!
  • В этой проблеме говорится, что «Добавление действительно динамической высоты строки (на которую влияет содержание строки) потребует от нас отключить многие функции». Они предлагают пару возможных решений, но один решительный разработчик попробовал это, и у него было много проблем с этим. Он мог заставить это работать, или он мог сдаться. Я не собираюсь рисковать.
1 голос
/ 04 февраля 2014

Недавно я разбудил SlickGrid, чтобы добавить множество новых функций, включая переменные (и изменяемые размеры) строки. Вы можете попробовать это здесь: https://github.com/globexdesigns/doby-grid

0 голосов
/ 02 декабря 2014

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

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

Я достаточно подробно изучил это, и, к сожалению, я не нашел жизнеспособных альтернатив, связанных с SlickGrid. Из других альтернатив я нашел только один бесплатный для коммерческого использования - dojox DataGrid , однако неясно, как вы могли бы использовать пользовательские редакторы с этим (большинство коммерческих предлагают это).

Существует немало жизнеспособных альтернатив, которые требуют оплаты за коммерческое использование: dhtmlxGrid, jQuery EasyUI DataGrid, jQWidgets, виджет Wijmo Grid, JideTable и Sencha ExtJS Grids. Из них я бы лично сказал, что лучшим является dhtmlxGrid http://dhtmlx.com/docs/products/dhtmlxGrid/ - бесплатная версия GPL, Pro-версия 199 долларов.

0 голосов
/ 12 февраля 2014

Определить эту переменную снаружи ....

var tableHeight = 0;

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

// 30 px для каждой строки, которая будет охватывать заголовок ... Вы можете настроить это значение для вашей таблицы.

tableHeight = dataTable.length * 30;    

if(tableHeight >  ($(window).height() - 400)){
       $("#myGrid").height($(window).height() - 400);
}else{
       $("#myGrid").height(tableHeight);
}

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

    $(window).resize(function() {

    // For grid height
    if(tableHeight >  ($(window).height() - 400)){
        $("#myGrid").height($(window).height() - 400);
    }else{
        $("#myGrid").height(tableHeight);
    }

    // For grid width
    $("#myGrid").width("100%");

    // Resize the grid dynamically. 
    gridName.resizeCanvas();
});
0 голосов
/ 24 сентября 2013

К решению Vihari Piratla - я скачал Seaview, изменил его /SlickGrid-master/examples/example1-simple.html, чтобы добавить новую опцию enableWrap - во время моего теста example1-simple.html продолжает работать, как и ожидалось, когда enableWrap имеет значение false, но когда его значение равно true, сетка отображается пустой без содержимого. Мне было интересно, если есть особый способ использовать параметр enableWrap?

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