当前位置:  开发笔记 > 后端 > 正文

将交替行颜色添加到SQL Server Reporting服务报告

如何解决《将交替行颜色添加到SQLServerReporting服务报告》经验,为你挑选了9个好方法。

如何在SQL Server Reporting Services报告中对交替行进行着色?


编辑:下面列出了许多好的答案 - 从快速,简单到复杂和全面.唉,我只能选一个......



1> Michael Hare..:

转到表行的BackgroundColor属性并选择"Expression ..."

使用此表达式:

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

这个技巧可以应用于报告的许多方面.

在.NET 3.5+中您可以使用:

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

不寻找代表 - 我只是自己研究这个问题,并认为我会分享.


我总是确保对那些回答自己问题的人进行投票.很多时候,提问者会自己找到答案然后再回来发布,让我们其余的人在黑暗中可能有同样的问题.先生,为你磕磕碰碰.
在某些情况下,这会失败,特别是在具有大量小计的表和矩阵对象中.Catch22的回应没有相同的限制.此外,Catch22的方法可用于强制矩阵中的列具有交替的列颜色,这在蓝色月亮中是有用的.
当我使用上面的代码时,我收到一条警告消息,如`[rsInvalidColor]文本框'active'的BackgroundColor属性的值是"Transparent",这不是一个有效的BackgroundColor.看起来正确的表达式将是` = IIf(RowNumber(Nothing)Mod 2 = 0,"Silver",Nothing)`.谢谢你的提示.
有些浏览器无法处理"透明"或"无".最好的选择是使用"白色"
这给出了分组和详细信息视图的问题

2> Catch22..:

使用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文章的详细信息


不要忘记在第一行之后的行中的所有列都将"True"更改为"False",否则您将看到棋盘效果!感谢您的解决方案 - 它非常棒!

3> 小智..:

当我使用Catch22的解决方案时,我得到了国际象棋效果,我认为因为我的矩阵在设计中有不止一列.那个表达对我很好:

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


这个答案值得更多关注 - 它是一个干净的解决方案,可以在具有行组和列组的矩阵中完美地工作,并且不需要自定义代码.美丽!
实际上,即使对于多列,这也可以正常工作 - 但如果在分组中有"丢失"数据则不行.因此,如果您的数据在2007年有12个月的数据数据但在2006年没有1月的数据,并且按行和每年在列上按月分组,那么2006年的着色将会被关闭,因为RunningValue会因为即使有仍然是"2006年1月"矩阵中的一个框,数据集中没有数据,RunningValue保持不变,没有颜色变化等.
这在我的Matrix多列中不起作用.

4> Michael Eaki..:

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

这比手动更改每个字段的背景颜色中的颜色要强大得多.



5> Beska..:

我注意到的一件事是前两种方法都没有任何关于第一行应该是什么颜色的概念; 该组将以与前一组的最后一行相反的颜色开始.我希望我的小组始终以相同的颜色开始......每组的第一行应始终为白色,下一行应为彩色.

基本概念是在每个组启动时重置切换,所以我添加了一些代码:

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都是全新的,所以我强烈怀疑还有很大的改进空间,但基本的想法看似合理(并且它很有用对我来说)所以我想把它扔出去.



6> 小智..:

对于组页眉/页脚:

=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



7> nonetaku..:

Michael Haren的解决方案对我来说很好.但是我收到一条警告说"透明"在预览时不是有效的BackgroundColor.通过在SSRS中设置Report Element的BackgroundColor,找到了一个快速修复程序 .使用Nothing而不是"Transparent"

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



8> Kyle Hale..:

在不使用VB的情况下解决此问题的唯一有效方法是在行分组(以及列分组外)中"存储"行分组模数值,并在列分组中明确引用它.我找到了这个解决方案

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

但Ankeet并不是解释正在发生的事情的最佳工作,他的解决方案建议在常量值上创建分组的不必要步骤,所以这是我对具有单个行组RowGroup1的矩阵的逐步过程:

    在RowGroup1中创建一个新列.将文本框重命名为RowGroupColor.

    将RowGroupColor的文本框的值设置为

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

    将所有行单元格的BackgroundColor属性设置为

    "=ReportItems!RowGroupColor.Value"

    将RowGroupColor列的宽度设置为0pt并将CanGrow设置为false以将其从客户端隐藏.

瞧!这也解决了这个线程中提到的很多问题:

为分组自动复位功能:只需添加一个新列该rowgroup,执行 RunningValue组值.

无需担心True/False切换.

颜色仅保存在一个地方,便于修改.

可以在行或列组上互换使用(只需将高度设置为0而不是宽度)

如果SSRS会暴露除Textboxes上的Value之外的属性,那将是很棒的.您可以在行组文本框的BackgroundColor属性中填充此类计算,然后在所有其他单元格中将其作为ReportItems!RowGroup.BackgroundColor引用.

啊,我们可以梦想......



9> Sarah Vessel..:

我的问题是我希望连续的所有列都具有相同的背景.我按行和按列分组,在这里我用前两个解决方案得到第1列中的所有行,带有彩色背景,第2列中的所有行都带有白色背景,第3列中的所有行都带有彩色背景, 等等.这是因为如果RowNumberbOddRow(的Catch22的解决方案)要注意我的栏目组,而不是忽略了,只用一个新行交替.

我想要的是第1行中的所有都有白色背景,然后第2行中的所有列都有彩色背景,然后第3行中的所有列都有白色背景,依此类推.我通过使用选定的答案得到了这个效果,但不是传递NothingRowNumber我,我传递了我的列组的名称,例如

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

认为这可能对其他人有用.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有