Мне удалось решить эту проблему, потому что я использовал собственную цветовую палитру, реализованную в виде хэш-таблицы. Я в основном сериализовал эту информацию и передал ее скрытому параметру в подотчете, а затем перефлировал структуру данных.
Это не идеально, но пока работает.
' 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
. Я спешил, поэтому я быстро преобразовал их в массив. Код взят из сериализации Collection в 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 уровня детализации, и он отлично работает.