Show only one Major/Minor grid line in RadChart

2 posts, 0 answers
  1. Raj
    Raj avatar
    1 posts
    Member since:
    Feb 2015

    Posted 08 Feb 2015 Link to this post

    I need to show a (only one) line across Bar chart to show current time. I am using RadChart first time and found Major/Minor Gridlines to show lines on graph, but either all grid lines will show or hide. I want only one grid line showing current time. Chart is simply showing stock name/number one X axis and price on Y axis. I am not using second Y axis. Any other option than gridline if can't achieve using gridline. Please help as earliest possible. Thanks
  2. Hristo
    Hristo avatar
    1519 posts

    Posted 11 Feb 2015 Link to this post

    Hello Raj,

    Thank you for writing.

    You could reach this type of functionality by attaching a custom controller which will draw a vertical today indicator. In order to position the indicator correctly we would need to calculate its coordinates compared to the axis start and end. Please see my code snippet below:
    public partial class Form1 : Form
        public Form1()
            BarSeries barSeries = new BarSeries();
            barSeries.DataPoints.Add(new CategoricalDataPoint(118, DateTime.Now.Date.AddHours(0)));
            barSeries.DataPoints.Add(new CategoricalDataPoint(177, DateTime.Now.Date.AddHours(4)));
            barSeries.DataPoints.Add(new CategoricalDataPoint(128, DateTime.Now.Date.AddHours(8)));
            barSeries.DataPoints.Add(new CategoricalDataPoint(111, DateTime.Now.Date.AddHours(12)));
            barSeries.DataPoints.Add(new CategoricalDataPoint(118, DateTime.Now.Date.AddHours(16)));
            barSeries.DataPoints.Add(new CategoricalDataPoint(118, DateTime.Now.Date.AddHours(20)));
            barSeries.DataPoints.Add(new CategoricalDataPoint(118, DateTime.Now.Date.AddHours(24)));
            DateTimeContinuousAxis continuousAxis = new DateTimeContinuousAxis();
            continuousAxis.LabelFormat = "{0:d}";
            continuousAxis.LabelFitMode = AxisLabelFitMode.MultiLine;
            barSeries.HorizontalAxis = continuousAxis;
            this.radChartView1.Controllers.Add(new TodayIndicatorController());
    public class TodayIndicatorController : ChartViewController
        protected ViewResult result;
        public TodayIndicatorController()
            this.result = new ViewResult(new TodayIndicatorView(this));
        protected override ActionResult OnDraw(EventArgs e)
            return this.result;
        private class TodayIndicatorView : IView
            private TodayIndicatorController owner;
            public TodayIndicatorView(TodayIndicatorController owner)
                this.owner = owner;
            public void Render(object context)
                Graphics graphics = context as Graphics;
                if (!(this.owner.Area is CartesianArea))
                using (Pen pen = new Pen(Color.LightBlue, 3))
                    CartesianArea area = this.owner.Area as CartesianArea;
                    MethodInfo mi = area.GetType().GetMethod("GetCartesianClipRect", BindingFlags.NonPublic | BindingFlags.Instance);
                    RectangleF clipRect = (RectangleF)mi.Invoke(area, null);
                    IChartView chartView = area.View;
                    float panX = (float)chartView.PlotOriginX;
                    float panY = (float)chartView.PlotOriginY;
                    float x = (float)this.GetLocationOfValue(DateTime.Now);
                    PointF lineStart = new PointF(x, clipRect.Y);
                    PointF lineEnd = new PointF(x, clipRect.Bottom);
                    graphics.DrawLine(pen, lineStart, lineEnd);
            private double GetLocationOfValue(DateTime value)
                DateTimeContinuousAxis axis = this.owner.Area.Axes[0] as DateTimeContinuousAxis;
                PropertyInfo modelProperty = axis.GetType().GetProperty("Model", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                object model = modelProperty.GetValue(axis);
                PropertyInfo plotInfoProperty = model.GetType().GetProperty("PlotInformation", BindingFlags.NonPublic | BindingFlags.Instance);
                object plotInfo = plotInfoProperty.GetValue(model);
                FieldInfo minField = plotInfo.GetType().GetField("Min", BindingFlags.Instance | BindingFlags.Public);
                decimal min = (decimal)minField.GetValue(plotInfo);
                FieldInfo maxField = plotInfo.GetType().GetField("Max", BindingFlags.Instance | BindingFlags.Public);
                decimal max = (decimal)maxField.GetValue(plotInfo);
                FieldInfo extendField = plotInfo.GetType().GetField("Extend", BindingFlags.Instance | BindingFlags.Public);
                decimal ext = (decimal)extendField.GetValue(plotInfo);
                decimal delta = max - min;
                decimal extend = ext / 2;
                decimal pointTicks = value.Ticks;
                decimal pointPosition = (pointTicks - min + extend) / delta;
                double position = (double)(pointPosition);
                ChartNode node = model as ChartNode;
                IChartView view = (IChartView)this.owner.Area.View;
                CartesianArea area = this.owner.Area.View.GetArea<CartesianArea>();
                double result;
                if (area != null &&
                    ((area.Orientation == Orientation.Vertical && axis.AxisType == AxisType.First) ||
                    (area.Orientation == Orientation.Horizontal && axis.AxisType == AxisType.Second)))
                    result = view.PlotOriginX + node.LayoutSlot.X + position * node.LayoutSlot.Width;
                    result = view.PlotOriginY + node.LayoutSlot.Y + (1.0d - position) * node.LayoutSlot.Height;
                return result;

    I am also sending you screenshot showing the result on my end.

    Hristo Merdjanov

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

Back to Top