将交替行颜色添加到SQL Server报告服务报告
如何在SQL Server Reporting Services报告中遮蔽交替行?
编辑:下面列出了一堆好的答案 – 从简单到复杂,全面 。 唉,我只能选一个…
转到表行的BackgroundColor属性并select“Expression …”
使用这个expression式:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
这个技巧可以应用到报告的很多领域。
而在.NET 3.5+中,您可以使用:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
不寻找代表 – 我刚刚自己研究这个问题,并认为我会分享。
使用IIF(RowNumber …)会导致行被分组时的一些问题,另一种方法是使用简单的VBScript函数来确定颜色。
这是一个更多的努力,但是当基本的解决scheme是不够的,这是一个不错的select。
基本上,您将代码添加到报告如下…
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的解决scheme时,我得到了象棋的效果,我想因为我的matrix在devise中有多个列。 这个expression对我来说很好:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
我已经改变@Catch22的解决scheme有点,因为我不喜欢进入每个领域的想法,如果我决定我想改变其中的一种颜色。 在需要颜色variables改变的众多领域的报告中,这一点尤为重要。
'************************************************************************* ' -- 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
注意到我已经将接受颜色的function改变为包含要使用的颜色的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
所以我现在有三种不同的单元格背景:
- 数据行的第一列有= Code.AlternateColor(“AliceBlue”,“White”,True)(与前面的答案相同)
- 数据行的剩余列有= Code.AlternateColor(“AliceBlue”,“White”,False)(这也和前面的答案一样)
- 分组的第一列有= Code.RestartColor(“AliceBlue”)(这是新的)
- 分组行的剩余列有= Code.AlternateColor(“AliceBlue”,“White”,False)(之前使用过,但没有提及分组行。)
这对我有用。 如果你希望分组行是非颜色的,或者是不同的颜色,那么从这个方面来看应该是相当明显的。
请随意添加关于如何改进此代码的意见:我对SSRS和VB都是全新的,所以我强烈地怀疑有很大的改进空间,但是基本的想法听起来很有用(而且这很有用对我来说)所以我想把它扔在这里。
为组页眉/页脚:
=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
您也可以使用它来“重置”每个组内的行颜色计数。 我希望每个子组中的第一个详细信息行以White开始,并且此解决scheme(在详细信息行上使用时)允许发生这种情况:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
请参阅: http : //msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
迈克尔·哈伦的解决scheme对我来说很好。 不过,我收到警告,说预览时“Transparent”不是有效的BackgroundColor。 通过设置SSRS中Report元素的BackgroundColorfind了一个快速解决scheme。 使用Nothing而不是“Transparent”
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
不使用VB解决此问题的唯一有效方法是在行分组内(并在列分组之外)“存储”行分组模数值,并在列分组中明确引用它。 我find了这个解决scheme
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
但Ankeet并不是解释发生什么事情的最佳工作,他的解决schemebuild议在常量值上创build分组的不必要的步骤,因此,下面是具有单个行组RowGroup1的matrix的分步过程:
- 在RowGroup1中创build一个新的列。 将这个文本框重命名为RowGroupColor。
-
将RowGroupColor的文本框的值设置为
=iif(RunningValue(Fields! [RowGroupField] .Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
-
将所有行单元格的BackgroundColor属性设置为
"=ReportItems!RowGroupColor.Value"
- 将RowGroupColor列的宽度设置为0pt,并将CanGrow设置为false以将其从客户端隐藏。
瞧! 这也解决了这个线程中提到的很多问题:
- 为子组自动重置:只需为该行组添加一个新列, 对其组值执行RunningValue 。
- 无需担心真/假切换。
- 颜色只能在一个地方容易修改。
- 可以在行或列组上互换使用(只需将高度设置为0而不是宽度)
如果SSRS会在文本框上显示除Value以外的属性,那将是非常棒的。 您可以在行组文本框的BackgroundColor属性中进行这种计算,然后在所有其他单元格中将其作为ReportItems!RowGroup.BackgroundColor引用。
啊,好吧,我们可以梦想…
我的问题是,我想要连续的所有列具有相同的背景。 我按行和列分组,在这里我列出了第一列的所有行,彩色背景,第二列的所有行以白色背景,第三列的所有行以彩色背景, 等等。 就好像RowNumber
和bOddRow
(Catch22的解决scheme)注意到了我的列组,而不是忽略它,只是交替与一个新的行。
我想要的是第1行中的所有列都具有白色背景,然后第2行中的所有列都具有彩色背景,然后第3行中的所有列都具有白色背景,依此类推。 我通过使用select的答案得到了这种效果,但是没有将Nothing
传递给RowNumber
,我传递了列组的名称,例如
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
以为这可能对别人有用。
我想这个技巧不在这里讨论。 所以在这里,
在任何types的复杂matrix中,当需要交替单元格颜色时,无论是明智行还是列明,工作解决scheme,
如果你想明智地select另一种颜色的细胞,
- 在报表devise视图的右下angular,在“列组”中,创build名为“FakeParentGroup”的虚拟父组(使用expression式)。
- 然后,在报告devise中,对于要交替着色的单元格,请使用以下背景颜色expression式
= IIF(RunningValue(Fields![ColumnGroupField] .Value,countDistinct,“FakeParentGroup”)MOD 2,“White”,“LightGrey”)
就这样。
相同的替代颜色行明智的,只是你必须相应地编辑解决scheme。
注意:在这里,有时你需要相应地设置单元格边框,通常它会消失。
另外不要忘了删除创build假父组时创build的报告中的值1。
如果整个报告需要交替显示颜色,则可以使用Tablix所绑定的数据集作为报告范围内的报告范围标识号,并将其用于RowNumber函数中。
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
有人可以解释在下面的代码中将其余字段变为false的逻辑(从上面的post)
我注意到的一件事是,前两种方法都没有关于第一行应该在一个组中的什么颜色的任何概念; 该小组将从与前一组的最后一行相反的颜色开始。 我希望我的团队始终以相同的颜色开始……每个团队的第一行应始终为白色,下一行为彩色。
基本的概念是当每个组开始时重置切换,所以我添加了一些代码:
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
所以我现在有三种不同的单元格背景:
- 数据行的第一列有= Code.AlternateColor(“AliceBlue”,“White”,True)(与前面的答案相同)
- 数据行的剩余列有= Code.AlternateColor(“AliceBlue”,“White”,False)(这也和前面的答案一样)
- 分组的第一列有= Code.RestartColor(“AliceBlue”)(这是新的)
- 分组行的剩余列有= Code.AlternateColor(“AliceBlue”,“White”,False)(之前使用过,但没有提及分组行。)
这对我有用。 如果你希望分组行是非颜色的,或者是不同的颜色,那么从这个方面来看应该是相当明显的。
请随意添加关于如何改进此代码的意见:我对SSRS和VB都是全新的,所以我强烈地怀疑有很大的改进空间,但是基本的想法听起来很有用(而且这很有用对我来说)所以我想把它扔在这里。
@ Aditya的答案很好,但是如果行的第一个单元格(用于行背景格式)缺less值(在具有列/行组和复合列表的列表中),格式化将会被抛出。
countDistinct
的解决scheme巧妙地利用了runningValue
函数的countDistinct
结果来标识一个tablix(行)组中的行号。 如果第一个单元格中的tablix行缺less值, 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")
希望这可以帮助。
我用行空间在一个分组的Tablix上尝试了所有这些解决scheme,而且在整个报告中都没有任何工作。 结果是重复的彩色行和其他解决scheme导致交替列!
这里是我写的使用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列的Tablix我使用这个expression式的行(的单元格)Backcolour:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
只是因为上面的答案似乎没有工作在我的matrix,我在这里发布:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
我的matrix数据中缺less值,所以我无法获得ahmad的解决scheme,但是这个解决scheme对我很有帮助
基本的想法是在包含颜色的最内层的组上创build一个子组和一个字段。 然后根据该字段的值设置行中每个单元格的颜色。
稍微修改其他来自这里的答案,为我工作。 我的团队有两个值组合,所以我能够把他们都放在第一个参数与一个+来让它正确地交替
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
当使用行和列组时,我遇到了一个问题,就是颜色在列之间交替,即使它们是同一行。 我通过使用一个全局variables来解决这个问题,只有当这个行发生变化时,
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
现在,在要replace的行的第一列中,将颜色expression式设置为:
= Code.AlternateColor()
–
在其余列中,将它们全部设置为:
= Code.BGColor
这应该使颜色仅在第一列被绘制之后交替。
这也可能(无法证实)提高性能,因为它不需要为每列进行math计算。