【概要】
積層型柱状チャートを使用した場合、チャート要素の表示順と凡例の表示順が異なります。これはチャート要素が下から上に向かって描画されることが原因です。この問題を解決するためには反対順に凡例を表示させるロジックを実装する必要があります。
【該当するコンポーネント】
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. チャートにデータをバインドし、カスタムラベルを設定します。