150 votes

Ajouter une couleur de ligne alternée au rapport SQL Server Reporting services

Comment ombrager des lignes alternées dans un rapport SQL Server Reporting Services ?


Editar: Il y a un tas de bonnes réponses listées ci-dessous - du rapide y simple a complexe et complet . Hélas, je ne peux en choisir qu'un seul...

224voto

Michael Haren Points 42641

Allez dans la propriété BackgroundColor de la ligne du tableau et choisissez "Expression...".

Utilisez cette expression :

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

Cette astuce peut être appliquée à de nombreux domaines du rapport.

Et dans .NET 3.5+ vous pouvez utiliser :

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

Je ne cherche pas à me faire valoir, je me suis juste renseigné sur la question et j'ai pensé que je devais partager.

91voto

Catch22 Points 1240

L'utilisation de IIF(RowNumber...) peut entraîner certains problèmes lorsque les lignes sont regroupées. Une autre solution consiste à utiliser une simple fonction VBScript pour déterminer la couleur.

Cela demande un peu plus d'efforts, mais lorsque la solution de base ne suffit pas, c'est une alternative intéressante.

En gros, vous ajoutez du code au rapport comme suit...

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

Ensuite, sur chaque cellule, définissez la BackgroundColor comme suit :

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

Tous les détails sont sur ce site Article de Wrox

72voto

ahmad Points 381

J'ai obtenu l'effet d'échecs lorsque j'ai utilisé la solution de Catch22, je pense que c'est parce que ma matrice a plus d'une colonne dans la conception. cette expression a bien fonctionné pour moi :

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

20voto

Michael Eakins Points 3176

J'ai un peu modifié la solution de @Catch22 car je n'aime pas l'idée de devoir aller dans chaque champ si je décide de changer une des couleurs. Ceci est particulièrement important dans les rapports où il y a de nombreux champs dont la variable couleur doit être modifiée.

    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 Toggle As Boolean,Byval rowNumber as integer) As String
dim OddColor As String = "Green"
Dim EvenColor As String = "White"

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

J'ai remarqué que j'ai changé la fonction qui accepte les couleurs en une fonction qui contient les couleurs à utiliser.

Puis, dans chaque champ, ajoutez :

=Code.AlternateColor(True, rownumber(nothing))

C'est beaucoup plus robuste que de changer manuellement la couleur dans chaque champ backgroundcolor.

17voto

Beska Points 6717

Une chose que j'ai remarquée, c'est qu'aucune des deux méthodes ci-dessus n'a la moindre idée de la couleur que doit avoir la première ligne d'un groupe ; le groupe commencera simplement par la couleur opposée à celle de la dernière ligne du groupe précédent. Je voulais que mes groupes commencent toujours avec la même couleur... la première ligne de chaque groupe devrait toujours être blanche, et la ligne suivante colorée.

Le concept de base était de réinitialiser la bascule lorsque chaque groupe commence, j'ai donc ajouté un peu de code :

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

J'ai donc trois types différents de fonds de cellule maintenant :

  1. La première colonne de la ligne de données a =Code.AlternateColor("AliceBlue", "White", True) (C'est la même réponse que la précédente).
  2. Les colonnes restantes de la ligne de données ont =Code.AlternateColor("AliceBlue", "White", False) (Ceci est également identique à la réponse précédente).
  3. La première colonne de la ligne de regroupement a =Code.RestartColor("AliceBlue") (C'est nouveau.)
  4. Les colonnes restantes de la ligne de regroupement ont =Code.AlternateColor("AliceBlue", "White", False) (Ceci a été utilisé auparavant, mais aucune mention de cela pour la ligne de regroupement).

Cela fonctionne pour moi. Si vous souhaitez que la ligne de regroupement ne soit pas colorée, ou qu'elle soit d'une couleur différente, la façon de la modifier devrait être assez évidente.

N'hésitez pas à ajouter des commentaires sur ce qui pourrait être fait pour améliorer ce code : Je suis tout nouveau à la fois dans SSRS et dans VB, donc je soupçonne fortement qu'il y a beaucoup de place pour l'amélioration, mais l'idée de base semble saine (et elle m'a été utile) donc je voulais la présenter ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X