Фон jqGrid zebra/alt rows не работает из-за класса темы пользовательского интерфейса

Мы не можем заставить полосу зебры работать в jqGrid.

Мы используем altclass и altRows - проблема в том, что класс ui-widget-content из пользовательского интерфейса JQuery имеет параметр background, который переопределяет настройку background нашего альтернативного класса. Любые идеи?


Обновление: оба ответа ниже работают. Олег - самое чистое решение на сегодняшний день.

Чтобы решение Олега работало, ваш класс altRows должен быть определен после включения класса JQuery UI CSS, поскольку и пользовательский интерфейс JQuery, и пользовательский класс alt rows определяют свойство background и выигрывает последний определенный класс.


person Marcus Leon    schedule 06.12.2010    source источник
comment
Не могли бы вы опубликовать пример кода, включая пользовательский интерфейс jQuery, который вы используете. Как именно вы определяете altclass класс, который вы используете. Лучше всего полный пример кода, который воспроизводит проблему.   -  person Oleg    schedule 06.12.2010


Ответы (4)


jqGrid использует класс пользовательского интерфейса jQuery 'ui-priority-secondary' в качестве значения параметра altclass по умолчанию. Этот класс описан в документации пользовательского интерфейса jQuery как

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

Это, конечно, не точное описание полосы зебры, но стандартных классов, которые можно использовать, не так много. К сожалению, четные строки с 'ui-priority-secondary' выглядят не так уж сильно отличающимися от нечетных строк в большинстве тем. Таким образом, чтобы улучшить видимость, нужно определить класс altclass вручную.

Один из самых нативных способов сделать так, чтобы четные строки выглядели иначе, чем нечетные, — это использование другого цвета фона. Проблема в том, что класс ui-widget-content использует фоновое изображение, определенное в стиле background CSS, поэтому самая родная настройка background-color не будет работать. Чтобы решить проблему, нужно сделать одно из следующих действий: 1) удалить класс ui-widget-content 2) использовать стиль CSS background вместо background-color 2) использовать background-image:none вместе со стилем background-color. Самый простой способ сделать это — определить свой собственный AltRowClass как

.myAltRowClass { background: #DDDDDC; }

or

.myAltRowClass { background-color: #DDDDDC; background-image: none; }

а затем использовать параметры altRows:true и altclass:'myAltRowClass' jqGrid.

Другой способ — сделать то же самое без параметров altRows и altclass:

loadComplete: function() {
    $("tr.jqgrow:odd").css("background", "#DDDDDC");
}

В этом случае у вас будут небольшие недостатки при наведении или выборе четных линий. Следующий код работает лучше, но он делает то же самое, что и altRows:true и altclass:'myAltRowClass':

loadComplete: function() {
    $("tr.jqgrow:odd").addClass('myAltRowClass');
}

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

ОБНОВЛЕНО: только что заметил, что забыл включить ссылку на демонстрационный файл, который демонстрирует то, что я написал вживую. Демонстрация находится здесь.

person Oleg    schedule 07.12.2010
comment
@Marcus: я внес небольшие изменения в свой ответ и добавил URL-адрес в демонстрацию. - person Oleg; 08.12.2010
comment
Интересно.. Я попробую использовать параметр background-image:none вместо того, чтобы использовать подход, который я описал с помощью removeClass('ui-widget-content') - person Marcus Leon; 08.12.2010
comment
Сработало - одно предостережение - см. мой обновленный вопрос. Спасибо Олег! - person Marcus Leon; 09.12.2010
comment
@Marcus: я прочитал обновленную часть вашего вопроса. Это именно то, что я имею в виду и то, что я использовал в своей демонстрации, но я считаю полезным указать на важность порядка для других читателей. - person Oleg; 09.12.2010

Согласно Олегу.. в loadComplete:

$.each(grid.getDataIDs(),
    function(index, key){
        if(index % 2 !== 0) {
            var t = $("#" + key, grid);
            t.removeClass('ui-widget-content');
        }
    }
);

И затем в определении сетки:

altRows:true,
altclass:'myAltRowClass',

С `myAltRowClass':

.myAltRowClass { background: #F8F8F8 ; border:1px solid #DDDDDD;  }
person Marcus Leon    schedule 06.12.2010
comment
Извините, Маркус, это решение вашей проблемы или только объяснение? Если это не решение, вы должны также включить определение myAltRowClass, которое вы используете. - person Oleg; 07.12.2010
comment
Что ж, это работает, но это не лучшее решение. Если вы примените тему, отличную от flick, то сетка будет выглядеть не так, как должна, поскольку я жестко кодирую цвет границы в myAltRowClass (см. обновленный пост), а в некоторых других темах используются другие цвета. Поэтому, если бы мы использовали другую тему, мне пришлось бы изменить цвет в myAltRowClass. Это не идеально — я хотел бы иметь возможность выбрать другую тему и заставить ее работать мгновенно без каких-либо других изменений. Обратите внимание, что я должен включить свойство border, так как нечетные строки по-прежнему используют ui-widget-content, который устанавливает границу. - person Marcus Leon; 07.12.2010
comment
Я не дизайнер. Если класс altclass по умолчанию 'ui-priority-secondary' хорошо определен дизайнером темы, то у всех тем не будет проблем. Если 'ui-priority-secondary' - не лучший выбор и вы не можете найти другой стандартный класс, существующий во всех темах, который можно использовать как altclass, то вам придется настроить его собственный altclass для каждая тема. Я не вижу путей. - person Oleg; 07.12.2010
comment
Достаточно честно, Олег - если вы хотите добавить ответ на этот вопрос, я приму его, поскольку решение, которое я использовал, пришло из одного из ваших (других) ответов. - person Marcus Leon; 07.12.2010
comment
Я согласен с тобой. Я предполагаю, что проблема распространена, поэтому я сделал еще несколько тестов и написал свой ответ на ваши вопросы, используя в основном ту же информацию, которую вы уже знали. - person Oleg; 08.12.2010

вот мое решение:

altRows     : true,
altclass    : 'oddRow',

gridComplete: function() {
    $(".jqgrow:odd").hover(
        function() { $(this).removeClass("oddRow");}, 
        function(event) { $(this).addClass("oddRow");}
    );
}, 

это сработало для меня и может быть использовано с любой темой пользовательского интерфейса.

person thanat    schedule 30.09.2011

Я добавил следующий CSS в дополнительный файл, чтобы задать стиль для альтернативной строки и наведения строки без использования дополнительного Javascript:

table.ui-jqgrid-btable tr:nth-child(odd) td{
    background-color: #E7F0FD;
}
table.ui-jqgrid-btable tr:hover:nth-child(odd) td{
    background: url("images/ui-bg_glass_75_dadada_1x400.png") repeat-x scroll 50% 50% rgb(6, 41, 97);
}
person Chris G    schedule 02.05.2013