【概要】
積層型柱状チャートを使用した場合、チャート要素の表示順と凡例の表示順が異なります。これはチャート要素が下から上に向かって描画されることが原因です。この問題を解決するためには反対順に凡例を表示させるロジックを実装する必要があります。

【該当するコンポーネント】
UltraWinChart

【該当するバージョン】
全てのバージョン

【記事の種類】
How-to

【詳細】

  1. 新しいアプリケーションを作成し、チャートをフォームに追加します。
  2. チャートにバインドするデータを作成します。
  3. チャートタイプをStackColumnChart と設定し、ColorModel.Skin に表示色の追加を行います。
  4. 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. チャートにデータをバインドし、カスタムラベルを設定します。

Tagged:

製品について

Ultimate UI for Windows Forms