为 SQL Server Reporting Services 报表添加交替行颜色

如何在 SQL Server Reporting Services 报告中为交替的行加上阴影?


编辑: 下面列出了一些很好的答案——从 快点很简单复杂而全面。唉,我只能选择一个..。

285110 次浏览

转到表格行的 Background Color 属性并选择“ Expression...”

使用这个短语:

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

这个技巧可以应用到报告的许多方面。

在.NET 3.5 + 中,你可以使用:

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

不是找代表,我只是自己研究了一下这个问题,想和大家分享一下。

在对行进行分组时,使用 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

然后在每个单元格上设置 BackoundColor 如下:

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

延伸阅读 : 报告解决方案模式和食谱: Greenbar Reports | Wrox

分组标题/页脚:

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

您还可以使用它来“重置”每个组中的行颜色计数。我希望每个子组中的第一个细节行从 White 开始,这个解决方案(在细节行上使用时)允许这种情况发生:

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

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

我注意到,前两个方法都没有关于组中第一行应该是什么颜色的概念; 组只是从前一个组的最后一行的相反颜色开始。我希望我的小组总是以相同的颜色开始... 每个小组的第一行应该总是白色,下一行的颜色。

基本概念是在每组开始时重置开关,所以我添加了一些代码:

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. Data row 的第一列 has = Code.AlternateColor (“ AliceBlue”,“ White”,True)(这与前一个答案相同。)
  2. 数据行的其余列具有 = Code.AlternateColor (“ AliceBlue”,“ White”,False)(这也与前一个答案相同。)
  3. 分组行的第一列具有 = Code.RestartColor (“ AliceBlue”)(这是新的。)
  4. 分组行的其余列 have = Code。AlternnateColor (“ AliceBlue”,“ White”,False)(以前曾使用过,但在分组行时没有提到它。)

这对我有用。如果希望分组行是非着色的,或者是不同的颜色,那么从这里可以很明显地看出如何改变它。

请随意添加关于如何改进这段代码的注释: 我对 SSRS 和 VB 都是全新的,所以我强烈怀疑还有很大的改进空间,但是基本的想法似乎是合理的(对我来说也是有用的) ,所以我想在这里抛出它。

我的问题是,我希望一行中的所有列都有相同的背景。我按行和按列分组,这里的前两个解决方案得到了 所有,第一列中的行有彩色背景,第二列中的所有行有白色背景,第三列中的所有行有彩色背景,以此类推。这就好像 RowNumberbOddRow(Catch22的解决方案)关注我的列组,而不是忽略它,只交替使用一个新行。

我想要的是第一行中的所有 柱子都有一个白色背景,然后第二行中的所有列都有一个彩色背景,然后第三行中的所有列都有一个白色背景,以此类推。我通过使用选定的答案获得了这种效果,但是没有将 Nothing传递给 RowNumber,而是传递了列组的名称,例如。

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

我想这个可能对别人有用。

如果对于整个报表您需要一个交替颜色,您可以使用 DataSet,您的 Tablix 绑定到该报表上的一个报表范围的标识行号,并在 RowNumber 函数中使用该行号..。

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")

Michael Haren 的解决方案对我很有效。然而,我得到一个警告说,“透明”是不是一个有效的背景颜色时,预览。找到了一个快速解决办法 在 SSRS 中设置报表元素的背景色。不使用“透明”而使用“无”

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

当我使用 Catch22的解决方案时,我得到了象棋效果,我想是因为我的矩阵在设计中有多个列。 这个表达对我很有用:

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")

我已经改变了@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))

这比手动更改每个字段的背景颜色要健壮得多。

有人能解释一下在下面的代码(从上面的文章)中将其余字段转换为 false 的逻辑吗

我注意到,前两个方法都没有关于组中第一行应该是什么颜色的概念; 组只是从前一个组的最后一行的相反颜色开始。我希望我的小组总是以相同的颜色开始... 每个小组的第一行应该总是白色,下一行的颜色。

基本概念是在每组开始时重置开关,所以我添加了一些代码:

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. Data row 的第一列 has = Code.AlternateColor (“ AliceBlue”,“ White”,True)(这与前一个答案相同。)
  2. 数据行的其余列具有 = Code.AlternateColor (“ AliceBlue”,“ White”,False)(这也与前一个答案相同。)
  3. 分组行的第一列具有 = Code.RestartColor (“ AliceBlue”)(这是新的。)
  4. 分组行的其余列 have = Code。AlternnateColor (“ AliceBlue”,“ White”,False)(以前曾使用过,但在分组行时没有提到它。)

这对我有用。如果希望分组行是非着色的,或者是不同的颜色,那么从这里可以很明显地看出如何改变它。

请随意添加关于如何改进这段代码的注释: 我对 SSRS 和 VB 都是全新的,所以我强烈怀疑还有很大的改进空间,但是基本的想法似乎是合理的(对我来说也是有用的) ,所以我想在这里抛出它。

只是因为上面的答案在我的矩阵中似乎都不起作用,所以我把这个贴在这里:

Http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html

我的矩阵数据缺少值,所以我无法得到 Ahmad 的解,但 这个办法对我很有效

基本思想是在最里面的组上创建一个包含颜色的子组和字段。然后根据该字段的值为行中的每个单元格设置颜色。

我想这里没有讨论这个魔术,

在任何类型的复杂矩阵中,当需要选择单元格的行或列颜色时, 可行的解决办法是,

如果需要单元格的另一种颜色,那么,

  1. 在报表设计视图的右下角的“ Column”中 组”,在1上创建一个假父组(使用表达式) ,名为 “假父母小组”。
  2. 然后,在报表设计中,对于要着色的单元格 或者,使用下面的背景颜色表达式

= IIF (RunningValue (Fields! [ ColumnGroupField ] . Value,CountDistrict,“ FakeParentGroup”) MOD 2,“ White”,“ LightGrey”)

仅此而已。

对于备用颜色行也是如此,只是您必须相应地编辑解决方案。

注意: 这里,有时需要相应地设置单元格的边框,通常它会消失。

也不要忘记删除报告中的值1进入图片时,您创建了假父组。

@ Aditya 的回答很棒,但是有些情况下,如果行的第一个单元格(用于行背景格式)缺少值(在包含列/行组和缺少值的复杂表格中) ,格式化就会被抛出。

@ Aditya 的解决方案巧妙地利用 runningValue函数的 countDistinct结果来识别表(行)组中的行号。如果第一个单元格中的 tablix 行缺少值,则 runningValue将不会递增 countDistinct结果,而是返回前一行的数字(因此会影响该单元格的格式)。为了说明这一点,您必须添加一个额外的术语来抵消 countDistinct值。我的想法是检查行组本身中的第一个运行值(参见下面代码片段的第3行) :

=iif(
(RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
+ iif(IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
) mod 2, "White", "LightGrey")

希望这个能帮上忙。

我在带有行空间的 GroupedTablix 上尝试了所有这些解决方案,但没有一个能够在整个报表中工作。结果是重复的彩色行和其他解决方案导致交替列!

下面是我使用 Column Count 编写的函数:

Private bOddRow As Boolean
Private cellCount as Integer


Function AlternateColorByColumnCount(ByVal OddColor As String, ByVal EvenColor As String, ByVal ColCount As Integer) As String


if cellCount = ColCount Then
bOddRow = Not bOddRow
cellCount = 0
End if


cellCount  = cellCount  + 1


if bOddRow Then
Return OddColor
Else
Return EvenColor
End If


End Function

对于7列表格,我使用这个表达式来表示 Row (of Cell) Backcolor:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)

稍微修改一下这里的其他答案,对我有用。我的组有两个值要分组,所以我能够将它们都放在第一个参数中,并加上一个 + ,以使其正确交替

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")

当同时使用行组和列组时,我遇到了一个问题: 即使是同一行,列之间的颜色也会交替出现。我通过使用一个全局变量来解决这个问题,该变量仅在行发生变化时进行交替:

Public Dim BGColor As String = "#ffffff"


Function AlternateColor() As String
If BGColor = "#cccccc" Then
BGColor = "#ffffff"
Return "#cccccc"
Else
BGColor = "#cccccc"
Return "#ffffff"
End  If
End Function

现在,在要交替使用的行的 第一列中,将颜色表达式设置为:

= 代码

-

在其余的列中,将它们全部设置为:

= Code.BGColor

这应该使颜色交替只有在第一列绘制之后。

这也可能(无法验证)提高性能,因为它不需要为每个列进行数学计算。