Completed
Last Updated: 23 Oct 2013 05:02 by ADMIN
ADMIN
Georgi I. Georgiev
Created on: 23 Oct 2013 05:02
Category: ChartView
Type: Bug Report
1
FIX. RadChartView - Enabling the TrackBall causes exception
To reproduce:
Add a RadChartView and add some LineSeries and data points. Set the ShowTrackBall property to true. In some cases KeyNotFound exception occurs.

Workaround:
Use the following class:
public class MyController : ChartTrackballController
{
    protected override string GetTrackballText(List<DataPointInfo> points)
    {
        StringBuilder result = new StringBuilder("<html>");

        SortedDictionary<ChartSeries, List<DataPoint>> visiblePoints = new SortedDictionary<ChartSeries, List<DataPoint>>(new ChartSeriesComparer());

        foreach (DataPointInfo pointInfo in points)
        {
            if (visiblePoints.ContainsKey(pointInfo.Series))
            {
                visiblePoints[pointInfo.Series].Add(pointInfo.DataPoint);
            }
            else
            {
                visiblePoints.Add(pointInfo.Series, new List<DataPoint>() { pointInfo.DataPoint });
            }
        }

        int counter = 0;
        foreach (ChartSeries series in visiblePoints.Keys)
        {
            for (int i = 0; i < visiblePoints[series].Count; i++)
            {
                Color pointColor = this.GetColorForDataPoint(series, visiblePoints[series][i]);
                string color = string.Format("{0},{1},{2},{3}", pointColor.A, pointColor.R, pointColor.G, pointColor.B);
                result.AppendFormat("<color={0}>{1}", color, this.GetPointText(visiblePoints[series][i]));

                if (i < visiblePoints[series].Count)
                {
                    result.Append(" ");
                }
            }

            counter++;

            if (counter < visiblePoints.Keys.Count)
            {
                result.Append("\n");
            }
        }

        result.Append("</html>");

        return result.ToString();
    }

    class ChartSeriesComparer : IComparer<ChartSeries>
    {
        public ChartSeriesComparer()
        {
        }

        public int Compare(ChartSeries x, ChartSeries y)
        {
            if (!(x is IndicatorBase) && y is IndicatorBase)
            {
                return -1;
            }
            else if (x is IndicatorBase && !(y is IndicatorBase))
            {
                return 1;
            }

            return x.GetHashCode().CompareTo(y.GetHashCode());
        }
    }
}

Replace the old controller as follows:
for (int i = 0; i < this.radChartView1.Controllers.Count; i++)
{
    if (this.radChartView1.Controllers[i] is ChartTrackballController)
    {
        this.radChartView1.Controllers[i] = new MyController();
        break;
    }
}

Note that the controller must be replaced before any data is added to the chart
0 comments