Добавьте чередующийся цвет строки в отчет служб отчетов SQL Server - PullRequest
141 голосов
/ 04 сентября 2008

Как закрасить чередующиеся строки в отчете служб отчетов SQL Server?


Редактировать: Ниже приведены несколько хороших ответов - от быстрый и простой до сложный и всеобъемлющий . Увы, я могу выбрать только одну ...

Ответы [ 18 ]

212 голосов
/ 04 сентября 2008

Перейдите к свойству BackgroundColor строки таблицы и выберите «Выражение ...»

Используйте это выражение:

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Этот прием можно применить ко многим областям отчета.

А в .NET 3.5+ вы можете использовать:

= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Не ищу репутацию - я просто исследовал этот вопрос сам и подумал, что поделюсь.

87 голосов
/ 17 сентября 2008

Использование IIF (RowNumber ...) может привести к некоторым проблемам при группировании строк, а другой альтернативой является использование простой функции VBScript для определения цвета.

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

По сути, вы добавляете код в отчет следующим образом ...

Private bOddRow As Boolean
'*************************************************************************
' -- Display green-bar type color banding in detail rows
' -- Call from BackGroundColor property of all detail row textboxes
' -- Set Toggle True for first item, False for others.
'*************************************************************************
Function AlternateColor(ByVal OddColor As String, _
         ByVal EvenColor As String, ByVal Toggle As Boolean) As String
    If Toggle Then bOddRow = Not bOddRow
    If bOddRow Then
        Return OddColor
    Else
        Return EvenColor
    End If
End Function

Затем в каждой ячейке установите BackgroundColor следующим образом:

=Code.AlternateColor("AliceBlue", "White", True)

Полная информация по этому вопросу Статья Wrox

64 голосов
/ 21 июля 2011

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

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
20 голосов
/ 04 августа 2011

Я изменил решение @ Catch22 Немного, поскольку мне не нравится идея идти в каждое поле, если я решу, что хочу изменить один из цветов. Это особенно важно в отчетах, где есть многочисленные поля, для которых необходимо изменить цветовую переменную.

'*************************************************************************
' -- Display alternate color banding (defined below) in detail rows
' -- Call from BackgroundColor property of all detail row textboxes
'*************************************************************************
Function AlternateColor(Byval rowNumber as integer) As String
    Dim OddColor As String = "Green"
    Dim EvenColor As String = "White"

    If rowNumber mod 2 = 0 then 
        Return EvenColor
    Else
        Return OddColor
    End If
End Function

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

Затем в каждом поле добавьте:

=Code.AlternateColor(rownumber(nothing))

Это гораздо надежнее, чем изменение цвета фона каждого поля вручную.

16 голосов
/ 04 августа 2009

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

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

Private bOddRow As Boolean
'*************************************************************************
' -- Display green-bar type color banding in detail rows
' -- Call from BackGroundColor property of all detail row textboxes
' -- Set Toggle True for first item, False for others.
'*************************************************************************
Function AlternateColor(ByVal OddColor As String, _
         ByVal EvenColor As String, ByVal Toggle As Boolean) As String
    If Toggle Then bOddRow = Not bOddRow
    If bOddRow Then
        Return OddColor
    Else
        Return EvenColor
    End If
End Function
'
Function RestartColor(ByVal OddColor As String) As String
    bOddRow = True
    Return OddColor
End Function

Итак, теперь у меня есть три разных типа фона клетки:

  1. Первый столбец строки данных имеет значение = Code.AlternateColor («AliceBlue», «White», True) (совпадает с предыдущим ответом).
  2. Оставшиеся столбцы строки данных имеют = Code.AlternateColor («AliceBlue», «White», False) (Это также, как и предыдущий ответ.)
  3. Первый столбец строки группировки имеет = Code.RestartColor ("AliceBlue") (Это новое.)
  4. Оставшиеся столбцы строки группировки имеют = Code.AlternateColor («AliceBlue», «White», False) (раньше использовался, но не упоминается об этом для группировки строк.)

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

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

10 голосов
/ 06 декабря 2008

для верхних и нижних колонтитулов группы:

=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")

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

=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")

См .: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx

7 голосов
/ 06 апреля 2011

Решение Майкла Харена прекрасно работает для меня. Однако я получил предупреждение о том, что «Прозрачный» не является допустимым BackgroundColor при предварительном просмотре. Нашел быстрое решение от Настройка BackgroundColor элементов отчета в SSRS . Ничего не используйте вместо «Прозрачный»

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
6 голосов
/ 04 декабря 2012

Единственный эффективный способ решить эту проблему без использования VB - это «сохранить» значение группирования по модулю внутри группировки строк (и вне группировки столбцов) и явно ссылаться на него внутри группировки столбцов. Я нашел это решение на

http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html

Но Анкит не лучшим образом объясняет, что происходит, и его решение рекомендует ненужный шаг создания группировки по постоянному значению, поэтому вот мой пошаговый процесс для матрицы с одной группой строк RowGroup1 :

  1. Создать новый столбец в RowGroup1. Переименуйте текстовое поле для этого в что-то вроде RowGroupColor.
  2. Установите значение текстового поля RowGroupColor равным

    =iif(RunningValue(Fields!<strong>[RowGroupField]</strong>.Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")

  3. Установите свойство BackgroundColor всех ваших ячеек строки на

    "=ReportItems!RowGroupColor.Value"

  4. Установите ширину столбца RowGroupColor равным 0pt и установите CanGrow ложно, чтобы скрыть это от клиентов.

Вуаля! Это также решает много проблем, упомянутых в этой теме:

  • Автоматический сброс для подгрупп: просто добавьте новый столбец для этого группа строк, выполняющая RunningValue для ее значений группы.
  • Не нужно беспокоиться о переключениях True / False.
  • Цвета хранятся только в одном месте для легкой модификации.
  • Может использоваться взаимозаменяемо для групп строк или столбцов (просто установите высоту 0 вместо ширины)

Было бы замечательно, если бы SSRS выставлял свойства помимо Value on Textboxes. Вы можете просто вставить этот вид вычисления в свойство BackgroundColor текстовых полей группы строк, а затем ссылаться на него как ReportItems! RowGroup.BackgroundColor во всех других ячейках.

Ах, хорошо, мы можем мечтать ...

5 голосов
/ 25 сентября 2009

Моя проблема заключалась в том, что я хотел, чтобы все столбцы в строке имели одинаковый фон. Я сгруппировал по строкам и столбцам, и с двумя верхними решениями я получил все строки в столбце 1 с цветным фоном, все строки в столбце 2 с белым фоном, все строки колонка 3 с цветным фоном и тд. Это как если бы RowNumber и bOddRow (решения Catch22) обращали внимание на мою группу столбцов вместо того, чтобы игнорировать это и только чередовались с новой строкой.

Мне нужно, чтобы все столбцы в строке 1 имели белый фон, затем все столбцы в строке 2 имели цветной фон, а затем все столбцы в строке 3 имели белый фон. фон и так далее. Я получил этот эффект, используя выбранный ответ, но вместо передачи Nothing в RowNumber я передал имя своей группы столбцов, например,

=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")

Думал, что это может быть полезно кому-то еще.

4 голосов
/ 16 мая 2014

Я думаю, что этот трюк здесь не обсуждается. Так вот,

В любом типе сложной матрицы, когда вам нужны альтернативные цвета ячеек, будь то строка или столбец, рабочий раствор,

Если вы хотите, чтобы цвет клеток был альтернативным,

  1. В правом нижнем углу представления дизайна отчета в столбце Группы ", создайте поддельную родительскую группу на 1 (используя выражение) с именем "FakeParentGroup".
  2. Затем в дизайне отчета для ячеек, которые должны быть окрашены в качестве альтернативы используйте следующее выражение цвета фона

= IIF (RunningValue (Fields! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")

Вот и все.

То же самое для альтернативного цветного ряда, просто вы должны соответственно изменить решение.

ПРИМЕЧАНИЕ. Здесь иногда необходимо соответствующим образом установить границу ячеек, обычно она исчезает.

Также не забудьте удалить значение 1 в отчете, который появился на рис. При создании фиктивной родительской группы.

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