142

SQL Server Reporting Servicesレポートの交互の行をどのようにシェーディングしますか?


編集:以下にリストされている良い答えがたくさんあります-迅速単純なものから複雑で包括的なものまで。残念ながら、私は1つしか選択できません...

4

18 に答える 18

213

テーブル行のBackgroundColorプロパティに移動し、[式...]を選択します。

次の式を使用します。

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

このトリックは、レポートの多くの領域に適用できます。

また、.NET 3.5以降では、次を使用できます。

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

担当者を探していません-私はこの質問を自分で調べて、共有したいと思いました。

于 2008-09-04T18:19:32.850 に答える
89

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 の記事を参照してください。

于 2008-09-17T14:29:35.367 に答える
70

Catch22 のソリューションを使用すると、チェス効果が得られました。これは、マトリックスに複数の列が設計されているためだと思います。その式は私にとってはうまくいきました:

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
于 2011-07-21T14:47:17.490 に答える
20

色の1つを変更したい場合、各フィールドに移動する必要があるという考えが気に入らないので、@ 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))

これは、各フィールドの背景色の色を手動で変更するよりもはるかに堅牢です。

于 2011-08-04T13:06:33.323 に答える
16

私が気づいたことの 1 つは、上の 2 つの方法のどちらにも、グループ内の最初の行を何色にするかという概念がないことです。グループは、前のグループの最後の行とは反対の色で始まります。グループが常に同じ色で始まることを望んでいました...各グループの最初の行は常に白で、次の行は色である必要があります。

基本的なコンセプトは、各グループの開始時にトグルをリセットすることだったので、少しコードを追加しました。

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

したがって、現在、3 種類のセルの背景があります。

  1. データ行の最初の列は =Code.AlternateColor("AliceBlue", "White", True) です (これは前の回答と同じです。)
  2. データ行の残りの列には =Code.AlternateColor("AliceBlue", "White", False) があります (これも前の回答と同じです。)
  3. グループ化行の最初の列には =Code.RestartColor("AliceBlue") があります (これは新規です。)
  4. グループ化行の残りの列には =Code.AlternateColor("AliceBlue", "White", False) があります (これは以前に使用されていましたが、グループ化行については言及されていません。)

これは私にとってはうまくいきます。グループ行を無色にしたい、または別の色にしたい場合、これをどのように変更するかは明らかです。

このコードを改善するために何ができるかについて、自由にコメントを追加してください。私にとっては)だからここに捨てたかったのです。

于 2009-08-03T21:09:46.850 に答える
10

グループ ヘッダー/フッターの場合:

=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/en-us/library/ms159136(v=sql.100).aspx

于 2008-12-06T04:48:49.437 に答える
8

マイケル・ハーレンのソリューションは私にとってはうまくいきます。ただし、プレビュー時に「透明」は有効な背景色ではないという警告が表示されました。SSRS で Report 要素の BackgroundColor を設定することによる簡単な修正が見つかりました 。「透明」の代わりに何も使用しない

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
于 2011-04-06T07:44:38.647 に答える
6

VB を使用せずにこれを解決する唯一の効果的な方法は、行のグループ化のモジュロ値を行のグループ化内 (および列のグループ化の外) に "格納" し、列のグループ化内で明示的に参照することです。私はこの解決策を見つけました

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

しかし、Ankeet は何が起こっているのかを説明するのに最適な仕事ではなく、彼の解決策では、定数値でグループ化を作成するという不要な手順を推奨しています。そのため、単一の行グループ RowGroup1 を持つ行列の段階的なプロセスを次に示します。

  1. RowGroup1 内に新しい列を作成します。このテキスト ボックスの名前を RowGroupColor などに変更します。
  2. RowGroupColor のテキスト ボックスの値を

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

  3. すべての行セルの BackgroundColor プロパティを

    "=ReportItems!RowGroupColor.Value"

  4. RowGroupColor 列の幅を 0pt に設定し、CanGrow を false に設定してクライアントから非表示にします。

出来上がり!これにより、このスレッドで言及されている多くの問題も解決されます。

  • サブグループの自動リセット: その行グループに新しい列を追加し、 そのグループ値に対してRunningValueを実行するだけです。
  • True/False のトグルを気にする必要はありません。
  • 簡単に変更できるように、色は 1 か所にのみ保持されます。
  • 行グループまたは列グループで同じ意味で使用できます (幅ではなく高さを 0 に設定するだけです)。

SSRS が Textbox の Value 以外のプロパティを公開するのはすばらしいことです。この種の計算を行グループ テキスト ボックスの BackgroundColor プロパティに詰め込み、それを他のすべてのセルで ReportItems!RowGroup.BackgroundColor として参照することができます。

ああ、私たちは夢を見ることができます...

于 2012-12-03T21:27:22.893 に答える
5

私の問題は、行のすべての列に同じ背景を持たせたいということでした。行と列の両方でグループ化しました。上位 2 つのソリューションを使用して、列 1 のすべての行を色付きの背景で、列 2 のすべての行を白い背景で、列 3 のすべての行を色付きの背景でグループ化しました。 、 等々。あたかも(Catch22のソリューションの)RowNumberそれbOddRowを無視して新しい行と交互にするだけでなく、私の列グループに注意を払うかのようです.

私が望んでいたのは、行 1 のすべてのの背景を白に、次に行 2 のすべての列の背景に色を付け、次に行 3 のすべての列の背景を白にする、ということです。選択した回答を使用してこの効果を得ましたが、に渡す代わりにNothingRowNumber列グループの名前を渡しました。

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

これは他の誰かに役立つかもしれないと考えました。

于 2009-09-25T15:45:01.840 に答える
4

このトリックはここでは議論されていないと思います。だからここにあります、

任意のタイプの複雑なマトリックスで、行ごとまたは列ごとにセルの色を交互に変更したい場合、実際の解決策は次のとおりです。

セルの列ごとに別の色が必要な場合は、

  1. レポート デザイン ビューの右下隅にある [列グループ] で、(式を使用して) 1 に「FakeParentGroup」という名前の偽の親グループを作成します。
  2. 次に、レポート デザインで、代替的に色付けされるセルに対して、次の背景色表現を使用します。

=IIF(RunningValue( Fields![ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "White", "LightGrey")

それで全部です。

別の色の行についても同じですが、それに応じてソリューションを編集する必要があります。

注: ここでは、それに応じてセルの境界線を設定する必要がある場合がありますが、通常は消えます。

また、偽の親グループを作成したときに pic に入ったレポートの値 1 を削除することを忘れないでください。

于 2014-05-16T06:32:01.070 に答える
2

レポート全体で交互の色が必要な場合は、レポートのレポート全体の ID 行番号に Tablix がバインドされている DataSet を使用し、それを RowNumber 関数で使用できます...

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")
于 2010-08-06T16:38:00.133 に答える
1

以下のコードで残りのフィールドを false に変更するロジックを誰かが説明できますか (上記の投稿から)。

私が気づいたことの 1 つは、上の 2 つの方法のどちらにも、グループ内の最初の行を何色にするかという概念がないことです。グループは、前のグループの最後の行とは反対の色で始まります。グループが常に同じ色で始まることを望んでいました...各グループの最初の行は常に白で、次の行は色である必要があります。

基本的なコンセプトは、各グループの開始時にトグルをリセットすることだったので、少しコードを追加しました。

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

したがって、現在、3 種類のセルの背景があります。

  1. データ行の最初の列は =Code.AlternateColor("AliceBlue", "White", True) です (これは前の回答と同じです。)
  2. データ行の残りの列には =Code.AlternateColor("AliceBlue", "White", False) があります (これも前の回答と同じです。)
  3. グループ化行の最初の列には =Code.RestartColor("AliceBlue") があります (これは新しいものです)。
  4. グループ化行の残りの列には =Code.AlternateColor("AliceBlue", "White", False) があります (これは以前に使用されていましたが、グループ化行については言及されていません。)

これは私にとってはうまくいきます。グループ化行を無色にしたい、または別の色にしたい場合、これをどのように変更するかは明らかです。

このコードを改善するために何ができるかについて、自由にコメントを追加してください。私にとっては)だからここに捨てたかったのです。

于 2012-03-01T03:15:06.097 に答える
0

私のために働いたここからの他の答えのわずかな修正。私のグループにはグループ化する 2 つの値があるため、両方を最初の引数に + を付けて配置し、正しく交互にすることができました。

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
于 2016-07-11T22:00:20.007 に答える
0

私の行列データには欠損値が含まれていたため、ahmad のソリューションを機能させることができませんでしたが、このソリューションは私にとってはうまくいきました

基本的な考え方は、色を含む最も内側のグループに子グループとフィールドを作成することです。次に、そのフィールドの値に基づいて、行の各セルの色を設定します。

于 2013-12-02T19:57:53.017 に答える
0

上記の答えがどれも私のマトリックスではうまくいかないようだったので、ここに投稿します:

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

于 2013-11-28T00:41:07.327 に答える