Answers:
转到表行的BackgroundColor属性,然后选择“表达式...”
使用以下表达式:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
此技巧可以应用于报告的许多区域。
在.NET 3.5+中,您可以使用:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
不寻找代表-我只是自己研究了这个问题,并认为我会分享。
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
,就像正确的表达式一样=IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
。不过,感谢您的提示。
当对行进行分组时,使用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文章的完整详细信息
当我使用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))
这比手动更改每个字段的背景色的颜色要强得多。
我注意到的一件事是,前两种方法都没有关于第一行应该在组中什么颜色的任何概念。该组将从与上一组的最后一行相反的颜色开始。我希望我的组始终以相同的颜色开始...每个组的第一行应始终为白色,而下一行应为彩色。
基本概念是在每个组开始时重置切换,因此我添加了一些代码:
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
所以我现在有三种不同的细胞背景:
这对我有用。如果您希望分组行是无色或不同的颜色,那么如何更改它应该是很明显的。
请随时添加有关如何改进此代码的注释:我对SSRS和VB都是陌生的,因此我强烈怀疑仍有很大的改进空间,但是基本思想似乎是合理的(并且很有用)对我来说),所以我想把它扔在这里。
对于组页眉/页脚:
=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/zh-cn/library/ms159136(v=sql.100).aspx
Michael Haren的解决方案对我来说很好。但是我收到警告,说预览时“透明”不是有效的BackgroundColor。在SSRS中从设置Report元素的BackgroundColor找到了快速修复 。不使用任何内容代替“透明”
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
不使用VB来解决此问题的唯一有效方法是将行分组模值“存储”在行分组内(以及列分组外),并在列分组内显式引用它。我在找到这个解决方案
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
但是Ankeet并不能最好地解释发生的事情,他的解决方案建议采取不必要的步骤来基于常数值创建分组,因此,这是我针对具有单个行组RowGroup1的矩阵的分步过程:
将RowGroupColor的文本框的值设置为
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
将所有行单元格的BackgroundColor属性设置为
"=ReportItems!RowGroupColor.Value"
瞧!这也解决了该线程中提到的许多问题:
如果SSRS公开“文本框上的值”之外的属性,那就太好了。您可以在行组文本框的BackgroundColor属性中填充这种计算,然后在所有其他单元格中将其引用为ReportItems!RowGroup.BackgroundColor。
嗯,我们可以做梦...
我的问题是我希望连续的所有列都具有相同的背景。我按行和按列进行分组,在这里使用前两个解决方案,使第1列中的所有行都带有彩色背景,第2列中的所有行都带有白色背景,第3列中的所有行都带有彩色背景, 等等。好像RowNumber
和bOddRow
(Catch22解决方案的)要注意我的列组,而不是忽略它,而只是与新行交替。
我想要的是让第1行中的所有列具有白色背景,然后使第2行中的所有列具有彩色背景,然后使第3行中的所有列具有白色背景,依此类推。我通过使用选定的答案获得了这种效果,但没有传递Nothing
给RowNumber
,而是传递了列组的名称,例如
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
认为这对其他人可能有用。
在任何类型的复杂矩阵中,当您想要交替使用单元格颜色(按行或按列)时,有效的解决方案是:
如果您想明智地选择其他颜色的细胞,
= IIF(RunningValue(Fields![ColumnGroupField] .Value,countDistinct,“ FakeParentGroup”)MOD 2,“白色”,“浅灰色”)
就这样。
明智的做法是交替使用颜色行,只是您必须相应地编辑解决方案。
注意:在这里,有时您需要相应地设置单元格的边框,通常它会消失。
另外,当您创建假父组时,请不要忘记删除报告中出现的报告中的值1。
@Aditya的答案很好,但是在某些情况下,如果行的第一单元格(用于行背景格式)缺少值(在具有列/行组和值的复杂表格中,则格式将被取消)。
@Aditya的解决方案巧妙地利用函数的countDistinct
结果runningValue
来识别tablix(行)组中的行号。如果第一个单元格中的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")
希望这可以帮助。
有人可以在下面的代码中解释从其余字段变为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
所以我现在有三种不同的细胞背景:
这对我有用。如果您希望分组行是无色或不同的颜色,那么如何更改它应该是很明显的。
请随时添加有关如何改进此代码的注释:我对SSRS和VB都是陌生的,因此我强烈怀疑仍有很大的改进空间,但是基本思想似乎是合理的(并且很有用)对我来说),所以我想把它扔在这里。
我在带有行空格的分组Tablix上尝试了所有这些解决方案,但没有一个解决方案适用于整个报表。结果是重复的彩色行,其他解决方案导致交替的列!
这是我使用列数为我编写的功能:
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列Tablix,我将此表达式用于行(单元格)的背景色:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
仅仅因为以上答案似乎都不在我的矩阵中起作用,所以我在这里发布了此内容:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
我的矩阵数据中缺少值,因此无法获得ahmad的解决方案,但该解决方案对我有用
基本思想是在包含颜色的最里面的组上创建一个子组和字段。然后根据该字段的值为行中的每个单元格设置颜色。
当同时使用行和列组时,我遇到一个问题,即使同一行,颜色也会在列之间交替。我通过使用仅在行更改时才更改的全局变量解决了此问题:
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.AlternateColor()
--
在其余的列中,将它们全部设置为:
= Code.BGColor
这应该仅在绘制第一列之后才使颜色交替。
这也可以(不可验证地)提高性能,因为它不需要为每一列进行数学计算。