To reproduce:
this.chart.Controllers.Add(new ChartTrackballController());
this.chart.Dock = DockStyle.Fill;
this.chart.AreaType = ChartAreaType.Cartesian;
LineSeries lineSeries1 = new LineSeries();
lineSeries1.Name = "Line 1";
lineSeries1.DataPoints.Add(new CategoricalDataPoint(10, "1"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(4, "2"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(23, "3"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(11, "4"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(15, "5"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(10, "6"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(4, "7"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(7, "8"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(11, "9"));
lineSeries1.DataPoints.Add(new CategoricalDataPoint(15, "10"));
this.chart.Series.Add(lineSeries1);
LineSeries lineSeries2 = new LineSeries();
lineSeries2.Name = "Line 2";
lineSeries2.DataPoints.Add(new CategoricalDataPoint(6, "1"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(20, "2"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(7, "3"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(8, "4"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(4, "5"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(10, "6"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(24, "7"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(17, "8"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(18, "9"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(43, "10"));
this.chart.Series.Add(lineSeries2);
this.chart.ShowTrackBall = true;
For workaround, use this class:
public class MyTrackBallController : ChartTrackballController
{
protected override string GetTrackballText(List<DataPointInfo> points)
{
StringBuilder result = new StringBuilder("<html>");
SortedDictionary<Telerik.WinControls.UI.ChartSeries, List<DataPoint>> visiblePoints
= new SortedDictionary<Telerik.WinControls.UI.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 (Telerik.WinControls.UI.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<Telerik.WinControls.UI.ChartSeries>
{
public int Compare(Telerik.WinControls.UI.ChartSeries x, Telerik.WinControls.UI.ChartSeries y)
{
if (!(x is IndicatorBase) && y is IndicatorBase)
{
return -1;
}
else if (x is IndicatorBase && !(y is IndicatorBase))
{
return 1;
}
if (x.Equals(y))
{
return 0;
}
return 1;
}
}
}