我在TechNet上使用a technique described为我的图表创建了自定义调色板。
我还有一系列钻取柱形图,您可以在其中单击一列,然后将参数传递到下一个图表,依此类推,给出了向下钻取的外观。
我的图表由3种类型的人工组成,主图表上有三种颜色。当我深入到下一个图表时,一些类别没有主要类型的所有三种类型的劳动力。因此,调色板中的第一种颜色被分配给系列,即使它是上一个图表中的第二种颜色。如果可能的话,我想避免这种情况。
因此,第一个图表上的数据值为绿色(颜色顺序为第2个),下一个图表上为黄色(颜色顺序为第1个)。如何使图表“记住”第一个图表中的系列组总数?
这是Reporting Services 2005。
答案 0 :(得分:2)
您无法使用自定义调色板修复此问题。
您可以做的是为人工类型分配数据库中的颜色(使用HEX最简单)。然后将其传入您的数据集中。然后将color属性设置为十六进制值。
答案 1 :(得分:1)
不幸的是,这是不可能的。我一直在寻找这个... ...
答案 2 :(得分:0)
我能够解决这个问题,因为我使用的是自定义调色板,实现为哈希表。我基本上将这些信息序列化并将其传递给子报表上的隐藏参数,然后重新填充数据结构。
它并不完美,但它现在有效。
' Define some globals, including the color palette '
Private colorPalette As String() = _
{"#FFF8A3", "#A9CC8F", "#B2C8D9", "#BEA37A", "#F3AA79", "#B5B5A9", "#E6A5A4", _
"#F8D753", "#5C9746", "#3E75A7", "#7A653E", "#E1662A", "#74796F", "#C4384F", _
"#F0B400", "#1E6C0B", "#00488C", "#332600", "#D84000", "#434C43", "#B30023"}
' color palette pulled from SAP guidelines '
' http://www.sapdesignguild.org/resources/diagram_guidelines/color_palettes.html '
Private count As Integer = 0
Private colorMapping As New System.Collections.Hashtable()
' Create a custom color palette '
Public Function GetColor(ByVal groupingValue As String) As String
If colorMapping.ContainsKey(groupingValue) Then
Return colorMapping(groupingValue)
End If
Dim c As String = colorPalette(count Mod colorPalette.Length)
count = count + 1
colorMapping.Add(groupingValue, c)
Return c
End Function
' In custom actions of the data value, set the results of this '
' function to the mapping parameter in the next report '
Public Function PassColorMapping() As String
If colorMapping.Count = 0 Then
Return Nothing
End If
Try
' convert the hashtable to an array so it can be serialized '
Dim objHash As Object()() = ToJaggedArray(colorMapping)
' serialize the colorMapping variable '
Dim outStream As New System.IO.StringWriter()
Dim s As New System.Xml.Serialization.XmlSerializer(GetType(Object()()))
s.Serialize(outStream, objHash)
' move on to the next report '
Return outStream.ToString()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Function
我遇到了一个问题,我无法找到该报告的onLoad事件的等价物。由于我不知道在哪里放置这个膨胀代码,我把它粘贴在绘图区域的背景颜色中。因此我总是回归“WhiteSmoke”。如果我能找到合适的地方,我会改变它。
' Call this function when the report loads to get the series groups '
' that have already been loaded into the custom color palette '
' Pass in the parameter used to store the color mapping '
Public Function InflateParamMapping(ByVal paramMapping As Parameter) As String
Try
If paramMapping.Value Is Nothing Then
Return "WhiteSmoke"
ElseIf colorMapping.Count = 0 Then
Dim pXmlized As String = paramMapping.Value
' deserialize the mapping parameter '
Dim s As New System.Xml.Serialization.XmlSerializer(GetType(Object()()))
' get the jagged array and convert to hashtable '
Dim objHash As Object()() = DirectCast(s.Deserialize(New System.IO.StringReader(pXmlized)), Object()())
' stick the result in the global colorMapping hashtable '
colorMapping = ToHashTable(objHash)
count = colorMapping.Count
End If
Catch ex As Exception
' MsgBox(ex.Message) '
End Try
Return "WhiteSmoke"
End Function
ToJaggedArray()
和ToHashTable()
是辅助函数,因为HashTable不可序列化,因为它们实现了IDictionary
。我赶时间,所以我只是快速将它们转换成阵列。代码来自Mark Richman撰写的Collection Serialization in ASP.NET Web
Services文章。我将代码从C#转换为VB.NET以在报告中使用。
Public Function ToJaggedArray(ByVal ht As System.Collections.HashTable) As Object()()
Dim oo As Object()() = New Object(ht.Count - 1)() {}
Dim i As Integer = 0
For EAch key As Object in ht.Keys
oo(i) = New Object() {key, ht(key)}
i += 1
Next
Return oo
End Function
Public Function ToHashTable(ByVal oo As Object()()) As System.Collections.HashTable
Dim ht As New System.Collections.HashTable(oo.Length)
For Each pair As Object() In oo
Dim key As Object = pair(0)
Dim value As Object = pair(1)
ht(key) = value
Next
Return ht
End Function
现在在报告中你需要做几件事。
System.Xml
的引用。=Code.PassColorMapping()
=Code.InflateParamMapping(Parameters!colorMapping)
=Code.GetColor(Fields!Type.Value)
您可以根据需要继续为多个子报表执行此操作 - 我目前有3个级别的钻取,并且工作正常。
答案 3 :(得分:0)
我解决了这个问题非常容易。
在我的父报告中,我可以说12个系列字段,每个字段在图表中获得自己的颜色,在我的子报告中,我只是将所有系列保留在图表上,例如使用柱形图到折线图向下钻取,但我控制了它们的可见性......
所以在系列属性的子报告中 - >可见性我只是添加一个表达式: =(Fields!ContentType.Value<> Parameters!ContentType.Value)
这样,报告只保留点击值的可见性并隐藏所有其他值,颜色保持不变:)