【概要】
積層型柱状チャートを使用した場合、チャート要素の表示順と凡例の表示順が異なります。これはチャート要素が下から上に向かって描画されることが原因です。この問題を解決するためには反対順に凡例を表示させるロジックを実装する必要があります。
【該当するコンポーネント】
UltraWinChart
【該当するバージョン】
全てのバージョン
【記事の種類】
How-to
【詳細】
- 新しいアプリケーションを作成し、チャートをフォームに追加します。
- チャートにバインドするデータを作成します。
- チャートタイプをStackColumnChart と設定し、ColorModel.Skin に表示色の追加を行います。
- ChartDrawItem イベントにて通常とは逆の表示色の順序を設定します。
In VB.NET:
PrivateSub UltraChart1_ChartDrawItem(ByVal sender AsObject, ByVal e As Infragistics.UltraChart.Shared.Events.ChartDrawItemEventArgs) Handles UltraChart1.ChartDrawItem
' Box プリミティブが描画されるかを判定します。
If (TypeOf e.Primitive Is Infragistics.UltraChart.Core.Primitives.Box) Then
'Box プリミティブがデータを保持しているか確認します。
If e.HasData Then
e.Primitive.PE.FillGradientStyle = GradientStyle.None
' 凡例がどうかを判定し、表示色を決定します。
If (e.Primitive.Path = "Border.Title.Legend") Then
e.Primitive.PE.FillGradientStyle = GradientStyle.None
e.Primitive.PE.Fill = Me.colors(System.Math.Abs(_numericColumns - 1 - e.Primitive.Column))
EndIf
EndIf
EndIf
EndSub
In C#:
private void ultraChart1_ChartDrawItem(object sender, Infragistics.UltraChart.Shared.Events.ChartDrawItemEventArgs e)
{
// Box プリミティブが描画されるかを判定します。
if (e.Primitive is Infragistics.UltraChart.Core.Primitives.Box)
{
// Box プリミティブがデータを保持しているか確認します。
if (e.HasData)
{
e.Primitive.PE.FillGradientStyle = Infragistics.UltraChart.Shared.Styles.GradientStyle.None;
// 凡例がどうかを判定し、表示色を決定します。
if (e.Primitive.Path == "Border.Title.Legend")
{
e.Primitive.PE.FillGradientStyle = Infragistics.UltraChart.Shared.Styles.GradientStyle.None;
e.Primitive.PE.Fill = this.colors[System.Math.Abs(numericColumns-1 - e.Primitive.Column)];
}
}
}
}
5. IRenderLabel インターフェィスを実装します
In VB.NET:
Public Class labels
Implements IRenderLabel
Private _dt As DataTable
Private _columns As Integer
Public Sub New(ByVal dt As DataTable)
_dt = dt
End Sub
Public Overloads Function ToString(ByVal Context As System.Collections.Hashtable) As String Implements Infragistics.UltraChart.Resources.IRenderLabel.ToString
' Column インデックスを基にラベル文字列を設定します。
Dim ColumnIndex As Int16 = System.Math.Abs(_dt.Columns.Count - 1 - CType(Context("DATA_COLUMN"), Integer))
Return _dt.Columns(ColumnIndex).ColumnName
End Function
End Class
In C#:
public class labels : IRenderLabel
{
private DataTable _dt;
public labels(DataTable dt)
{
_dt = dt;
}
#region IRenderLabel Members
public string ToString(System.Collections.Hashtable Context)
{
// Column インデックスを基にラベル文字列を設定します。
return _dt.Columns[Math.Abs(_dt.Columns.Count-1 - (int)Context["DATA_COLUMN"])].ColumnName;
}
#endregion
}
6. 数値列の個数を判定するメソッドを実装します。
7. チャートにデータをバインドし、カスタムラベルを設定します。