Completed
Last Updated: 17 Jul 2018 12:59 by Dimitar
To reproduce:
- The total amount should go bellow 0 with the last point:

var ws = new WaterfallSeries();
ws.ShowLabels = true;
ws.DataPoints.Add(new Telerik.Charting.WaterfallDataPoint(10.0, false, false));
ws.DataPoints.Add(new Telerik.Charting.WaterfallDataPoint(2.0, false, false));
ws.DataPoints.Add(new Telerik.Charting.WaterfallDataPoint(3.0, false, false));

ws.DataPoints.Add(new Telerik.Charting.WaterfallDataPoint(-20.0, false, false));

radChartView1.Series.Add(ws);

Workaround:
Set the minimum:
var verticalAxis = radChartView1.Axes[1] as LinearAxis;
verticalAxis.Minimum = -10;

Completed
Last Updated: 26 Jun 2018 06:55 by Dimitar
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: ChartView
Type: Bug Report
2
To reproduce: please refer to the attached sample project and gif file.

Workaround: 
            CustomLassoSelectionController lassoSelectionController = new CustomLassoSelectionController(); 
            this.radChartView1.Controllers.Add(lassoSelectionController);

        public class CustomLassoSelectionController : LassoSelectionController
        {
            private IList<DataPoint> selectedPoints = null;

            public CustomLassoSelectionController()
            {
                this.selectedPoints = new List<DataPoint>();
            }

            private Point ClipLocation(Point point)
            {
                CartesianArea area = this.Area.View.GetArea<CartesianArea>();
                if (area != null)
                {
                    RectangleF clipRect = GetCartesianClipRect(area);

                    if (point.X < clipRect.X)
                    {
                        point = new Point((int)clipRect.X, point.Y);
                    }

                    if (point.X > clipRect.Width + clipRect.X)
                    {
                        point = new Point((int)clipRect.Width + (int)clipRect.X, point.Y);
                    }

                    if (point.Y < clipRect.Y)
                    {
                        point = new Point(point.X, (int)clipRect.Y);
                    }

                    if (point.Y > clipRect.Height + clipRect.Y)
                    {
                        point = new Point(point.X, (int)clipRect.Height + (int)clipRect.Y);
                    }
                }

                return point;
            }

            internal RectangleF GetCartesianClipRect(CartesianArea area)
            {
                float x1, x2, y1, y2;
                x1 = 0;
                y1 = 0;
                x2 = (float)area.View.Viewport.Right;
                y2 = (float)area.View.Viewport.Bottom;

                foreach (var axis in area.View.Axes)
                {
                    if (axis.AxisType == AxisType.First)
                    {
                        if (axis.Model.VerticalLocation == AxisVerticalLocation.Bottom)
                        {
                            y2 = Math.Min(y2, (float)axis.Model.LayoutSlot.Y);
                        }
                        else
                        {
                            y1 = Math.Max(y1, (float)axis.Model.LayoutSlot.Bottom);
                        }

                        x1 = Math.Min(x1, (float)axis.Model.LayoutSlot.X);
                        x2 = Math.Min(x2, (float)axis.Model.LayoutSlot.Right);
                    }
                    else
                    {
                        if (axis.Model.HorizontalLocation == AxisHorizontalLocation.Left)
                        {
                            x1 = Math.Max(x1, (float)axis.Model.LayoutSlot.Right);
                        }
                        else
                        {
                            x2 = Math.Min(x2, (float)axis.Model.LayoutSlot.X);
                        }

                        y1 = Math.Max(y1, (float)axis.Model.LayoutSlot.Y);
                        y2 = Math.Min(y2, (float)axis.Model.LayoutSlot.Bottom);
                    }
                }

                RectangleF result = new RectangleF((float)area.View.Viewport.X + x1, (float)area.View.Viewport.Y + y1, x2 - x1 + 1, y2 - y1 + 1);

                return result;
            }

            protected override ActionResult OnMouseUp(MouseEventArgs e)
            {
                if (e.Button != MouseButtons.Left || this.MouseDownLocation == Point.Empty || this.MouseMoveLocation == Point.Empty)
                {
                    return base.OnMouseUp(e);
                }

                if (MouseDownLocation != MouseMoveLocation)
                {
                    this.MouseMoveLocation = ClipLocation(e.Location);
                    CartesianArea area = this.Area.View.GetArea<CartesianArea>();

                    if (area != null)
                    {
                        this.selectedPoints.Clear();
                        RectangleF areaRect = RectangleF.Empty;
                        IChartView chartView = this.Area.View;
                        areaRect = GetCartesianClipRect(area);

                        Point topLeft = new Point(Math.Min(MouseDownLocation.X, e.X), Math.Min(MouseDownLocation.Y, e.Y));
                        Point lowerRight = new Point(Math.Max(MouseDownLocation.X, e.X), Math.Max(MouseDownLocation.Y, e.Y));
                        RectangleF lassoRect = new RectangleF(new PointF(topLeft.X - (float)chartView.PlotOriginX - area.View.Margin.Left, topLeft.Y - (float)chartView.PlotOriginY - area.View.Margin.Top), new SizeF(lowerRight.X - topLeft.X, lowerRight.Y - topLeft.Y));

                        foreach (var series in area.View.Series)
                        {
                            foreach (var dataPoint in series.DataPoints)
                            {
                                if (lassoRect.Contains(new PointF((float)dataPoint.LayoutSlot.Location.X, (float)dataPoint.LayoutSlot.Location.Y)))
                                {
                                    dataPoint.IsSelected = true;
                                    this.selectedPoints.Add(dataPoint);
                                }
                                else
                                {
                                    dataPoint.IsSelected = false;
                                }
                            }
                        }
                        
                        ChartDataPointsEventArgs changedArgs = new ChartDataPointsEventArgs(this.selectedPoints);
                        this.OnLassoSelectedPointsChanged(changedArgs);
                    }

                    MouseDownLocation = MouseMoveLocation = Point.Empty;
                }

                this.Result.ShouldInvalidate = true;
                return this.Result;
            }
        }
Completed
Last Updated: 02 Jul 2018 09:36 by Dimitar
To reproduce:
- Add a polar chart with a selection controller.
- Click near the bottom right corner of the point (10 pixels away)
- The point is selected.

Workaround:
private void Chart_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
{
    e.Renderer = new MyPolarRenderer(e.Area as PolarArea);
}


class MyPolarRenderer : PolarRenderer
{
    public MyPolarRenderer(PolarArea area) : base(area)
    { }

    protected override void Initialize()
    {
        base.Initialize();
        for (int i = 0; i < this.DrawParts.Count; i++)
        {
            PolarPointSeriesDrawPart linePart = this.DrawParts[i] as PolarPointSeriesDrawPart;
            if (linePart != null)
            {
                this.DrawParts[i] = new MyDrawpart((PolarPointSeries)linePart.Element, this);
            }
        }
    }


}
class MyDrawpart : PolarPointSeriesDrawPart
{
    public MyDrawpart(PolarPointSeries series, IChartRenderer renderer) : base(series, renderer)
    { }
    public override DataPoint HitTest(Point location)
    {
        if (this.Element.PointSize.Width == 0 || this.Element.PointSize.Height == 0)
        {
            return null;
        }

        for (int i = 0; i < this.Element.DataPoints.Count; i++)
        {
            RadRect slot = this.Element.DataPoints[i].LayoutSlot;
            float pointHalfWidth = this.Element.PointSize.Width / 2;
            float pointHalfHeight = this.Element.PointSize.Height / 2;

            RectangleF dataPointBounds = new RectangleF((float)(slot.X - pointHalfWidth), (float)(slot.Y - pointHalfHeight), this.Element.PointSize.Width, this.Element.PointSize.Height);

            if (dataPointBounds.Contains(location.X, location.Y))
            {
                return this.Element.DataPoints[i];
            }
        }

        return null;
    }
}



Completed
Last Updated: 17 Jul 2018 07:17 by Dimitar
Use attached to reproduce.

Workaround:
private void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
{
    e.Renderer = new CustomCartesianRenderer(e.Area as CartesianArea);
}

public class CustomCartesianRenderer : CartesianRenderer
{
    public CustomCartesianRenderer(CartesianArea area) : base(area)
    {
    }

    protected override void Initialize()
    {
        base.Initialize();
        for (int i = 0; i < this.DrawParts.Count; i++)
        {
            LineSeriesDrawPart linePart = this.DrawParts[i] as LineSeriesDrawPart;
            if (linePart != null)
            {
                this.DrawParts[i] = new CustomLineSeriesDrawPart((LineSeries)linePart.Element, this);
            }
        }
    }

    
}
public class CustomLineSeriesDrawPart : LineSeriesDrawPart
{
    public CustomLineSeriesDrawPart(LineSeriesBase series, IChartRenderer renderer) : base(series, renderer)
    {
    }

    protected override PointF[] GetPointsPositionsArray()
    {
        List<DataPoint> points = new List<DataPoint>(this.Element.DataPoints);

        PointF[] result = new PointF[points.Count];

        for (int i = 0; i < points.Count; i++)
        {
            result[i] = new PointF(this.OffsetX + (float)points[i].LayoutSlot.X, this.OffsetY + (float)points[i].LayoutSlot.Y);
        }

        return result;
    }

}
Completed
Last Updated: 04 Jul 2018 11:32 by ADMIN
To reproduce:
            DataTable table = new DataTable();
            table.Columns.Add("Value", typeof(double));
            table.Columns.Add("Name", typeof(string));
            table.Rows.Add(1, "John");
            table.Rows.Add(3, "Adam");
            table.Rows.Add(5, "Peter");
            table.Rows.Add(12, "Sam");
            table.Rows.Add(6, "Paul");

            BarSeries lineSeria = new BarSeries();
            radChartView1.Series.Add(lineSeria);
            lineSeria.ValueMember = "Value";
            lineSeria.CategoryMember = "Name";

            this.radChartView1.DataSource = table;

        private void radButton1_Click(object sender, EventArgs e)
        { 
            this.radChartView1.DataSource = null; 
        }

The chart data will be still visible. It is necessary to set explicitly the DataSource of the series:
this.radChartView1.Series[0].DataSource = null;
Completed
Last Updated: 16 Apr 2018 11:03 by Dimitar
Use attached to reproduce. 

Workaround:
Use custom renderer: 

private void RadChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
{
    e.Renderer = new CustomCartesianRenderer(e.Area as CartesianArea);
}

public class CustomCartesianRenderer : CartesianRenderer
{
    public CustomCartesianRenderer(CartesianArea area)
        : base(area)
    { }
    protected override void Initialize()
    {
        base.Initialize();
        for (int i = 0; i < this.DrawParts.Count; i++)
        {
            CartesianGridLineAnnotationDrawPart linePart = this.DrawParts[i] as CartesianGridLineAnnotationDrawPart;
            if (linePart != null)
            {
                this.DrawParts[i] = new MyCartesianGridLineAnnotationDrawPart((CartesianGridLineAnnotation)linePart.Element, this);
            }
        }
    }
}
class MyCartesianGridLineAnnotationDrawPart : CartesianGridLineAnnotationDrawPart
{
    public MyCartesianGridLineAnnotationDrawPart(CartesianGridLineAnnotation element, CartesianRenderer renderer)
       : base(element, renderer)
    { }
    public override void Draw()
    {
      
        PropertyInfo modelProperty = typeof(CartesianGridLineAnnotation).GetProperty("Model",
        System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        object model = modelProperty.GetValue(this.Element);
        PropertyInfo layoutProperty = model.GetType().GetProperty("LayoutSlot", BindingFlags.Public | BindingFlags.Instance);
        RadRect radRect = (RadRect)layoutProperty.GetValue(model);
        RectangleF rect = ChartRenderer.ToRectangleF(radRect);


        rect.Offset(this.ViewportOffsetX, this.ViewportOffsetY);

        Graphics graphics = this.Renderer.Surface as Graphics;
       
        RadGdiGraphics radGraphics = new RadGdiGraphics(graphics);
        
        var clipRect = ChartRenderer.ToRectangle(this.Element.View.GetArea<CartesianArea>().AreaModel.PlotArea.LayoutSlot);
        clipRect.Offset((int)this.ViewportOffsetX,(int) this.ViewportOffsetY);

        graphics.SetClip(clipRect);
     

        GraphicsPath path = new GraphicsPath();
        path.AddLine(rect.Location, new PointF(rect.Right, rect.Bottom));

        BorderPrimitiveImpl border = new BorderPrimitiveImpl(this.Element, null);
        border.PaintBorder(radGraphics, null, path, rect);

        rect.Size = graphics.MeasureString(this.Element.Label, this.Element.Font);
        rect.Offset(this.Element.PositonOffset.Width + 1, this.Element.PositonOffset.Height + 1);

        TextParams tp = new TextParams();
        tp.font = this.Element.Font;
        tp.foreColor = this.Element.ForeColor;
        tp.paintingRectangle = rect;
        tp.text = this.Element.Label;

        TextPrimitiveHtmlImpl text = new TextPrimitiveHtmlImpl();
        text.PaintPrimitive(radGraphics, 0f, new SizeF(1f, 1f), tp);
    }
}


Completed
Last Updated: 12 Mar 2018 09:28 by Dimitar
How to reproduce: check the attached project

Workaround: 
private void button1_Click(object sender, EventArgs e)
{
    this.radChartView1.DataSource = null;
    foreach (ChartSeries series in this.radChartView1.Series)
    {
        series.DataSource = null;
    }

    this.radChartView1.Series.Clear();
}
Completed
Last Updated: 15 Feb 2018 09:51 by Dimitar
Workaround:
public class MyRadChartView : RadChartView
{
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadChartView).FullName;
        }
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(false);
    }
}
Completed
Last Updated: 25 Aug 2017 09:23 by ADMIN
To reproduce:
- Set the title and the offset:
radChartView1.Title = "Test Title";
radChartView1.ShowTitle = true;
radChartView1.ChartElement.TitleElement.PositionOffset = new SizeF(100, 100);

- Export the chart.
Completed
Last Updated: 16 Aug 2017 07:41 by ADMIN
To reproduce:
Add stacked series with equal category that has negative values as well.
Completed
Last Updated: 15 Aug 2017 11:03 by ADMIN
Workaround:

CartesianRenderer renderer = null;

public RadForm1()
{
    InitializeComponent();
    this.radChartView1.CreateRenderer += new ChartViewCreateRendererEventHandler(radChartView1_CreateRenderer);
    LineSeries lineSeries = new LineSeries();
    lineSeries.LegendTitle = "Line 1";
    lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
    lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
    lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul"));
    lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
    this.radChartView1.Series.Add(lineSeries);
    LineSeries lineSeries2 = new LineSeries();
    lineSeries2.LegendTitle = "Line 2";
    lineSeries2.DataPoints.Add(new CategoricalDataPoint(18, "Jan"));
    lineSeries2.DataPoints.Add(new CategoricalDataPoint(15, "Apr"));
    lineSeries2.DataPoints.Add(new CategoricalDataPoint(17, "Jul"));
    lineSeries2.DataPoints.Add(new CategoricalDataPoint(22, "Oct"));
    this.radChartView1.Series.Add(lineSeries2);
    this.radChartView1.ShowLegend = true;
    this.radChartView1.ChartElement.LegendPosition = LegendPosition.Float;
    this.radChartView1.ChartElement.LegendOffset = new Point(200, 95);

    CartesianArea area = this.radChartView1.GetArea<CartesianArea>();
    area.ShowGrid = true;
}

private void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
{
    renderer = new CartesianRenderer(e.Area as CartesianArea);
    e.Renderer = renderer; 
}

private void radButton1_Click(object sender, EventArgs e)
{ 
    string filePath = @"..\..\..\exportedChart" + DateTime.Now.ToLongTimeString().Replace(":", "_") + ".png";
    using (MemoryStream stream = new MemoryStream())
    {
        ExportToImage(this.radChartView1, stream, new Size(1000 ,500), ImageFormat.Png, filePath);
    }
    Process.Start(filePath);
}

public void ExportToImage(RadChartView chart, Stream stream, Size size, ImageFormat imageFormat, string filePath)
{
    if (!this.IsLoaded)
    {
        this.LoadElementTree();
    }

    size = Telerik.WinControls.TelerikDpiHelper.ScaleSize(size, chart.ChartElement.DpiScaleFactor);

    Bitmap bmp = new Bitmap(size.Width, size.Height);
    Graphics graphics = Graphics.FromImage(bmp);
    graphics.Clear(Color.White);

    SizeF titleSize = graphics.MeasureString(chart.Title, chart.ChartElement.TitleElement.Font, this.Width);

    if (chart.ChartElement.TitleElement.TextOrientation == Orientation.Vertical)
    {
        float swap = titleSize.Height;
        titleSize.Height = titleSize.Width;
        titleSize.Width = swap;
    }

    RadRect titleRect = new RadRect(0, 0, titleSize.Width, titleSize.Height);
    RadRect legendRect = new RadRect(0, 0, size.Width, size.Height);
    RadRect chartRect = legendRect;

    switch (chart.ChartElement.TitlePosition)
    {
        case TitlePosition.Top:
        case TitlePosition.Bottom:
            titleRect.Width = size.Width;
            break;
        case TitlePosition.Right:
        case TitlePosition.Left:
            titleRect.Height = size.Height;
            break;
    }

    chartRect.X += chart.View.Margin.Left;
    chartRect.Y += chart.View.Margin.Top;
    chartRect.Width -= chart.View.Margin.Horizontal;
    chartRect.Height -= chart.View.Margin.Vertical;

    if (chart.ShowTitle)
    {
        switch (chart.ChartElement.TitlePosition)
        {
            case TitlePosition.Top:
                legendRect.Y += titleRect.Height;
                chartRect.Y += titleRect.Height;
                legendRect.Height -= titleRect.Height;
                chartRect.Height -= titleRect.Height;
                break;
            case TitlePosition.Right:
                titleRect.X = size.Width - chart.ChartElement.TitleElement.Size.Width;
                titleRect.Height = size.Height;
                legendRect.Width -= titleRect.Width;
                chartRect.Width -= titleRect.Width;
                break;
            case TitlePosition.Bottom:
                titleRect.Y = size.Height - chart.ChartElement.TitleElement.Size.Height;
                titleRect.Width = size.Width;
                legendRect.Height -= titleRect.Height;
                chartRect.Height -= titleRect.Height;
                break;
            case TitlePosition.Left:
                titleRect.Height = size.Height;
                legendRect.X += titleRect.Width;
                chartRect.X += titleRect.Width;
                legendRect.Width -= titleRect.Width;
                chartRect.Width -= titleRect.Width;
                break;
        }
    }
    chart.View.Layout(chartRect);
    renderer.Draw(graphics);
    if (chart.ShowLegend)
    {
        switch (chart.ChartElement.LegendPosition)
        {
            case LegendPosition.Right:
                if (chart.ChartElement.TitlePosition == TitlePosition.Right)
                {
                    legendRect.X = titleRect.X - chart.ChartElement.LegendElement.Size.Width;
                }
                else
                {
                    legendRect.X = size.Width - chart.ChartElement.LegendElement.Size.Width;
                }

                legendRect.Width = chart.ChartElement.LegendElement.Size.Width;
                chartRect.Width -= legendRect.Width;
                break;
            case LegendPosition.Bottom:
                if (chart.ChartElement.TitlePosition == TitlePosition.Bottom)
                {
                    legendRect.Y = titleRect.Y - chart.ChartElement.LegendElement.Size.Height;
                }
                else
                {
                    legendRect.Y = size.Height - chart.ChartElement.LegendElement.Size.Height;
                }

                legendRect.Height = chart.ChartElement.LegendElement.Size.Height;
                chartRect.Height -= legendRect.Height;
                break;
            case LegendPosition.Left:
                legendRect.Width = chart.ChartElement.LegendElement.Size.Width;
                chartRect.X += legendRect.Width;
                chartRect.Width -= legendRect.Width;
                break;
            case LegendPosition.Top:
                legendRect.Height = chart.ChartElement.LegendElement.Size.Height;
                chartRect.Y += legendRect.Height;
                chartRect.Height -= legendRect.Height;
                break;
            case LegendPosition.Float:
                legendRect.Width = chart.ChartElement.LegendElement.Size.Width;
                legendRect.Height = chart.ChartElement.LegendElement.Size.Height;
                double xRatio = size.Width / this.Size.Width;
                double yRatio = size.Height / this.Size.Height;
                legendRect.X = (chart.ChartElement.LegendOffset.X * xRatio) + ((chart.ChartElement.TitlePosition == TitlePosition.Left)
                                                                               ? titleRect.Right : 0d);
                legendRect.Y = (chart.ChartElement.LegendOffset.Y * yRatio) + ((chart.ChartElement.TitlePosition == TitlePosition.Top)
                                                                               ? titleRect.Bottom : 0f);
                break;
        }
    }
    
    if (chart.ShowLegend)
    {
        float xTransform = (float)legendRect.X - chart.ChartElement.LegendElement.ControlBoundingRectangle.X +
                           ((float)legendRect.Width - chart.ChartElement.LegendElement.ControlBoundingRectangle.Width) / 2f;
        float yTransform = (float)legendRect.Y - chart.ChartElement.LegendElement.ControlBoundingRectangle.Y +
                           ((float)legendRect.Height - chart.ChartElement.LegendElement.ControlBoundingRectangle.Height) / 2f;
        graphics.TranslateTransform(xTransform, yTransform);
        chart.ChartElement.LegendElement.Paint(new RadGdiGraphics(graphics), chart.ChartElement.LegendElement.ControlBoundingRectangle, 0f,
            new SizeF(1f, 1f), true);
        graphics.ResetTransform();
    }
 
    RadGdiGraphics radGraphics = new RadGdiGraphics(graphics);

    if (chart.ShowTitle)
    {
        radGraphics.DrawString(chart.Title, GetTitleDrawRectangle(ChartRenderer.ToRectangleF(titleRect), titleSize,
            chart.ChartElement.TitleElement.TextAlignment), chart.ChartElement.TitleElement.Font,
            chart.ChartElement.TitleElement.ForeColor, chart.ChartElement.TitleElement.TextParams.CreateStringFormat(),
            chart.ChartElement.TitleElement.TextOrientation, chart.ChartElement.TitleElement.FlipText);
    }

    if (imageFormat == ImageFormat.Emf ||
        imageFormat == ImageFormat.Wmf)
    {
        Metafile metafile = new Metafile(stream, graphics.GetHdc()); // file is created here
        using (Graphics g = Graphics.FromImage(metafile))
        {
            g.DrawImage(bmp, Point.Empty);
        }

        metafile.Dispose();
        graphics.ReleaseHdc();
    }
    else
    {
        bmp.Save(stream, imageFormat);
    }

    chart.View.Layout();

    Image img = Image.FromStream(stream);
    graphics.DrawImage(img, new Point(0, 0));
    img.Save(filePath);
}

private RectangleF GetTitleDrawRectangle(RectangleF drawArea, SizeF textRect, ContentAlignment textAlignment)
{
    switch (textAlignment)
    {
        case ContentAlignment.BottomCenter:
            return new RectangleF(new PointF(drawArea.X + (drawArea.Width - textRect.Width) / 2f, drawArea.Bottom - textRect.Height), textRect);
        case ContentAlignment.BottomLeft:
            return new RectangleF(new PointF(drawArea.X, drawArea.Bottom - textRect.Height), textRect);
        case ContentAlignment.BottomRight:
            return new RectangleF(new PointF(drawArea.Right - textRect.Width, drawArea.Bottom - textRect.Height), textRect);
        case ContentAlignment.MiddleCenter:
            return new RectangleF(new PointF(drawArea.X + (drawArea.Width - textRect.Width) / 2f, drawArea.Y + (drawArea.Height - textRect.Height) / 2f), 
                textRect);
        case ContentAlignment.MiddleLeft:
            return new RectangleF(new PointF(drawArea.X, drawArea.Y + (drawArea.Height - textRect.Height) / 2f), textRect);
        case ContentAlignment.MiddleRight:
            return new RectangleF(new PointF(drawArea.Right - textRect.Width, drawArea.Y + (drawArea.Height - textRect.Height) / 2f), textRect);
        case ContentAlignment.TopCenter:
            return new RectangleF(new PointF(drawArea.X + (drawArea.Width - textRect.Width) / 2, drawArea.Y), textRect);
        case ContentAlignment.TopLeft:
            return new RectangleF(drawArea.Location, textRect);
        case ContentAlignment.TopRight:
            return new RectangleF(new PointF(drawArea.Right - textRect.Width, drawArea.Y), textRect);
        default:
            return new RectangleF(drawArea.Location, textRect);
    }
}
Completed
Last Updated: 15 Aug 2017 10:54 by ADMIN
Use the attached project to reproduce.

Workaround:
Check for zero values.
Completed
Last Updated: 15 Aug 2017 10:29 by ADMIN
How to reproduce:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.radChartView1.ShowLegend = true;

        LineSeries lineSeries = new LineSeries();
        lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
        lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
        lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul"));
        lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
        this.radChartView1.Series.Add(lineSeries);

        LineSeries lineSeries2 = new LineSeries();
        lineSeries2.DataPoints.Add(new CategoricalDataPoint(18, "Jan"));
        lineSeries2.DataPoints.Add(new CategoricalDataPoint(15, "Apr"));
        lineSeries2.DataPoints.Add(new CategoricalDataPoint(17, "Jul"));
        lineSeries2.DataPoints.Add(new CategoricalDataPoint(22, "Oct"));
        this.radChartView1.Series.Add(lineSeries2);

        ChartPanZoomController panZoomController = new ChartPanZoomController();
        panZoomController.PanZoomMode = ChartPanZoomMode.Horizontal;
        radChartView1.Controllers.Add(panZoomController);
    }

    private void radButton1_Click(object sender, EventArgs e)
    {
        this.radChartView1.ExportToImage(@"..\..\image.png", this.radChartView1.Size, System.Drawing.Imaging.ImageFormat.Png);
    }
}

Workaround: use a custom export to image method
public void ExportChartToImage(string filePath, Size size, ImageFormat imageFormat)
{
    using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    {
        if (!this.radChartView1.IsLoaded)
        {
            this.radChartView1.LoadElementTree();
        }

        Bitmap bmp = new Bitmap(size.Width, size.Height);
        Graphics graphics = Graphics.FromImage(bmp);
        graphics.Clear(Color.White);

        SizeF titleSize = graphics.MeasureString(this.radChartView1.Title, this.radChartView1.ChartElement.TitleElement.Font, this.Width);

        if (this.radChartView1.ChartElement.TitleElement.TextOrientation == Orientation.Vertical)
        {
            float swap = titleSize.Height;
            titleSize.Height = titleSize.Width;
            titleSize.Width = swap;
        }

        RadRect titleRect = new RadRect(0, 0, titleSize.Width, titleSize.Height);
        RadRect legendRect = new RadRect(0, 0, size.Width, size.Height);
        RadRect chartRect = legendRect;

        switch (this.radChartView1.ChartElement.TitlePosition)
        {
            case TitlePosition.Top:
            case TitlePosition.Bottom:
                titleRect.Width = size.Width;
                break;
            case TitlePosition.Right:
            case TitlePosition.Left:
                titleRect.Height = size.Height;
                break;
        }

        chartRect.X += this.radChartView1.View.Margin.Left;
        chartRect.Y += this.radChartView1.View.Margin.Top;
        chartRect.Width -= this.radChartView1.View.Margin.Horizontal;
        chartRect.Height -= this.radChartView1.View.Margin.Vertical;

        if (this.radChartView1.ShowTitle)
        {
            switch (this.radChartView1.ChartElement.TitlePosition)
            {
                case TitlePosition.Top:
                    legendRect.Y += titleRect.Height;
                    chartRect.Y += titleRect.Height;
                    legendRect.Height -= titleRect.Height;
                    chartRect.Height -= titleRect.Height;
                    break;
                case TitlePosition.Right:
                    titleRect.X = size.Width - this.radChartView1.ChartElement.TitleElement.Size.Width;
                    titleRect.Height = size.Height;
                    legendRect.Width -= titleRect.Width;
                    chartRect.Width -= titleRect.Width;
                    break;
                case TitlePosition.Bottom:
                    titleRect.Y = size.Height - this.radChartView1.ChartElement.TitleElement.Size.Height;
                    titleRect.Width = size.Width;
                    legendRect.Height -= titleRect.Height;
                    chartRect.Height -= titleRect.Height;
                    break;
                case TitlePosition.Left:
                    titleRect.Height = size.Height;
                    legendRect.X += titleRect.Width;
                    chartRect.X += titleRect.Width;
                    legendRect.Width -= titleRect.Width;
                    chartRect.Width -= titleRect.Width;
                    break;
            }
        }

        if (this.radChartView1.ShowLegend)
        {
            switch (this.radChartView1.ChartElement.LegendPosition)
            {
                case LegendPosition.Right:
                    if (this.radChartView1.ChartElement.TitlePosition == TitlePosition.Right)
                    {
                        legendRect.X = titleRect.X - this.radChartView1.ChartElement.LegendElement.Size.Width;
                    }
                    else
                    {
                        legendRect.X = size.Width - this.radChartView1.ChartElement.LegendElement.Size.Width;
                    }

                    legendRect.Width = this.radChartView1.ChartElement.LegendElement.Size.Width;
                    chartRect.Width -= this.radChartView1.View.Margin.Right;
                    break;
                case LegendPosition.Bottom:
                    if (this.radChartView1.ChartElement.TitlePosition == TitlePosition.Bottom)
                    {
                        legendRect.Y = titleRect.Y - this.radChartView1.ChartElement.LegendElement.Size.Height;
                    }
                    else
                    {
                        legendRect.Y = size.Height - this.radChartView1.ChartElement.LegendElement.Size.Height;
                    }

                    legendRect.Height = this.radChartView1.ChartElement.LegendElement.Size.Height;
                    chartRect.Height -= legendRect.Height;
                    break;
                case LegendPosition.Left:
                    legendRect.Width = this.radChartView1.ChartElement.LegendElement.Size.Width;
                    chartRect.X += legendRect.Width + this.radChartView1.View.Margin.Left;
                    chartRect.Width -= legendRect.Width + this.radChartView1.View.Margin.Left;
                    break;
                case LegendPosition.Top:
                    legendRect.Height = this.radChartView1.ChartElement.LegendElement.Size.Height;
                    chartRect.Y += legendRect.Height;
                    chartRect.Height -= legendRect.Height;
                    break;
                case LegendPosition.Float:
                    legendRect.Width = this.radChartView1.ChartElement.LegendElement.Size.Width;
                    legendRect.Height = this.radChartView1.ChartElement.LegendElement.Size.Height;
                    double xRatio = size.Width / this.Size.Width;
                    double yRatio = size.Height / this.Size.Height;
                    legendRect.X = (this.radChartView1.ChartElement.LegendOffset.X * xRatio) + ((this.radChartView1.ChartElement.TitlePosition == TitlePosition.Left) ? titleRect.Right : 0d);
                    legendRect.Y = (this.radChartView1.ChartElement.LegendOffset.Y * yRatio) + ((this.radChartView1.ChartElement.TitlePosition == TitlePosition.Top) ? titleRect.Bottom : 0f);
                    break;
            }
        }

        if (this.radChartView1.ShowLegend)
        {
            float xTransform = (float)legendRect.X - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.X + ((float)legendRect.Width - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.Width) / 2f;
            float yTransform = (float)legendRect.Y - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.Y + ((float)legendRect.Height - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.Height) / 2f;
            graphics.TranslateTransform(xTransform, yTransform);
            this.radChartView1.ChartElement.LegendElement.Paint(new RadGdiGraphics(graphics), this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle, 0f, new SizeF(1f, 1f), true);
            graphics.ResetTransform();
        }

        RadGdiGraphics radGraphics = new RadGdiGraphics(graphics);

        if (this.radChartView1.ShowTitle)
        {
            object[] miParams = new object[] { ChartRenderer.ToRectangleF(titleRect), titleSize, this.radChartView1.ChartElement.TitleElement.TextAlignment };
            radGraphics.DrawString(this.radChartView1.Title, (RectangleF)typeof(RadChartView).GetMethod("GetTitleDrawRectangle", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(this.radChartView1, miParams), this.radChartView1.ChartElement.TitleElement.Font,
                this.radChartView1.ChartElement.TitleElement.ForeColor, this.radChartView1.ChartElement.TitleElement.TextParams.CreateStringFormat(), this.radChartView1.ChartElement.TitleElement.TextOrientation, this.radChartView1.ChartElement.TitleElement.FlipText);
        }

        this.radChartView1.View.Layout(chartRect);

        IChartRenderer renderer = (IChartRenderer)typeof(ChartArea).GetProperty("Renderer", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this.radChartView1.Area);//
        renderer.Draw(graphics);

        if (imageFormat == ImageFormat.Emf ||
            imageFormat == ImageFormat.Wmf)
        {
            Metafile metafile = new Metafile(fs, graphics.GetHdc());
            using (Graphics g = Graphics.FromImage(metafile))
            {
                g.DrawImage(bmp, Point.Empty);
            }

            metafile.Dispose();
            graphics.ReleaseHdc();
        }
        else
        {
            bmp.Save(fs, imageFormat);
        }

        this.radChartView1.View.Layout();
    }
Completed
Last Updated: 25 May 2017 13:24 by ADMIN
How to reproduce: explicitly set the border color of the series

Workaround:
public partial class Form1 : Form
{
    private RangeSelectorViewElement chartElement;

    public Form1()
    {
        InitializeComponent();

        LineSeries lineSeries = new LineSeries();
        lineSeries.Name = "Line";
        lineSeries.BorderColor = Color.Green;
        lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
        lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
        lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul"));
        lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
        this.radChartView1.Series.Add(lineSeries);

        this.chartElement = this.radRangeSelector1.RangeSelectorElement.AssociatedElement as RangeSelectorViewElement;
        this.chartElement.SeriesInitialized += ChartElement_SeriesInitialized;
    }

    private void ChartElement_SeriesInitialized(object sender, SeriesInitializedEventArgs e)
    {
        if (e.Series.Name == "Line")
        {
            e.Series.BorderColor = this.radChartView1.Series.Where(s => s.Name == "Line").First().BorderColor;
        }
    }
}
Completed
Last Updated: 05 Jan 2017 07:45 by ADMIN
Workaround: use a custom ChartPanZoomController

public class MyChartPanZoomController : ChartPanZoomController
    {
        protected override ActionResult OnMouseWheel(MouseEventArgs e)
        {
            if (!(this.Area is CartesianArea))
            {
                return base.OnMouseWheel(e);
            }

            if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
            {
                IChartView chartView = this.Area.View;

                double zoomWidth = chartView.ZoomWidth;

                if (this.PanZoomMode == ChartPanZoomMode.Horizontal || this.PanZoomMode == ChartPanZoomMode.Both)
                {
                    zoomWidth += ((double)e.Delta / 1200d);
                }

                double zoomHeight = chartView.ZoomHeight;

                if (this.PanZoomMode == ChartPanZoomMode.Vertical || this.PanZoomMode == ChartPanZoomMode.Both)
                {
                    zoomHeight += ((double)e.Delta / 1200d);
                }

                zoomWidth = this.ClampValue(zoomWidth, 1d, 100d);
                zoomHeight = this.ClampValue(zoomHeight, 1d, 100d);

                double virtualHorizontalPosition = e.X - this.Area.AreaModel.LayoutSlot.X - chartView.PlotOriginX;
                double plotAreaVirtualWidth = this.Area.AreaModel.LayoutSlot.Width * chartView.ZoomWidth;
                double relativeHorizontalPosition = virtualHorizontalPosition / plotAreaVirtualWidth;
                double newPlotAreaVirtualWidth = this.Area.AreaModel.LayoutSlot.Width * zoomWidth;
                double newPanOffsetX = (newPlotAreaVirtualWidth * relativeHorizontalPosition) - (e.X - this.Area.AreaModel.LayoutSlot.X);
                newPanOffsetX = this.ClampValue(newPanOffsetX, 0, this.Area.AreaModel.LayoutSlot.Width * (zoomWidth - 1d));

                double virtualVerticalPosition = e.Y - this.Area.AreaModel.LayoutSlot.Y - chartView.PlotOriginY;
                double plotAreaVirtualHeight = this.Area.AreaModel.LayoutSlot.Height * chartView.ZoomHeight;
                double relativeVerticalPosition = virtualVerticalPosition / plotAreaVirtualHeight;
                double newPlotAreaVirtualHeight = this.Area.AreaModel.LayoutSlot.Height * zoomHeight;
                double newPanOffsetY = (newPlotAreaVirtualHeight * relativeVerticalPosition) - (e.Y - this.Area.AreaModel.LayoutSlot.Y);
                newPanOffsetY = this.ClampValue(newPanOffsetY, 0, this.Area.AreaModel.LayoutSlot.Height * (zoomHeight - 1d));

                this.Area.View.Zoom(zoomWidth, zoomHeight);
                this.Area.View.Pan(-newPanOffsetX, -newPanOffsetY);
            }

            return Controller.Empty;
        }

        private double ClampValue(double value, double minValue, double maxValue)
        {
            return Math.Max(minValue, Math.Min(value, maxValue));
        }
    }
Completed
Last Updated: 04 Jan 2017 19:14 by ADMIN
To reproduce:
- Add polar series and selection controller


Workaround:

private void RadChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
{
    e.Renderer = new MyPolarRenderer(e.Area as PolarArea);
}

class MyPolarRenderer : PolarRenderer
{
    public MyPolarRenderer(PolarArea area) : base(area)
    { }

    public override DataPoint HitTest(int x, int y)
    {
        for (int i = 0; i < this.DrawParts.Count; i++)
        {
            DataPoint dataPoint = this.DrawParts[i].HitTest(new Point(x, y));
            if (dataPoint != null)
            {
                return dataPoint;
            }
        }

        return base.HitTest(x, y);
    }
    protected override void Initialize()
    {
        base.Initialize();
        for (int i = 0; i < this.DrawParts.Count; i++)
        {
            PolarPointSeriesDrawPart linePart = this.DrawParts[i] as PolarPointSeriesDrawPart;
            if (linePart != null)
            {
                this.DrawParts[i] = new MyDrawpart((PolarPointSeries)linePart.Element, this);
            }
        }
    }

}
class MyDrawpart : PolarPointSeriesDrawPart
{
    public MyDrawpart(PolarPointSeries series, IChartRenderer renderer) : base(series, renderer)
    { }
    public override DataPoint HitTest(Point location)
    {
        if (this.Element.PointSize.Width == 0 || this.Element.PointSize.Height == 0)
        {
            return null;
        }

        for (int i = 0; i < this.Element.DataPoints.Count; i++)
        {
            RadRect slot = this.Element.DataPoints[i].LayoutSlot;
            float pointHalfWidth = this.Element.PointSize.Width / 2;
            float pointHalfHeight = this.Element.PointSize.Height / 2;

            RectangleF dataPointBounds = new RectangleF((float)(slot.X - pointHalfWidth), (float)(slot.Y - pointHalfHeight), this.Element.PointSize.Width, this.Element.PointSize.Height);

            if (dataPointBounds.Contains(location.X, location.Y))
            {
                return this.Element.DataPoints[i];
            }
        }

        return base.HitTest(location);
    }
}
Completed
Last Updated: 03 Jan 2017 12:58 by ADMIN
To reproduce:

private void RadChartView1_LabelFormatting(object sender, ChartViewLabelFormattingEventArgs e)
{
    var dataPoint = e.LabelElement.DataPoint as CategoricalDataPoint;
    if (dataPoint != null)
    {
         e.LabelElement.IsVisible = false;
    }
}

Workaround:
private void RadChartView1_LabelFormatting(object sender, ChartViewLabelFormattingEventArgs e)
{
    var dataPoint = e.LabelElement.DataPoint as CategoricalDataPoint;
    if (dataPoint != null)
    {
        e.LabelElement.Text = "";
    
    }
}


Completed
Last Updated: 12 Nov 2020 11:46 by ADMIN
Release R1 2021 (LIB 2020.3.1116)
Public Class RadForm2
    Public Sub New()
        InitializeComponent()

        AddHandler Me.RadChartView1.CreateRenderer, AddressOf radChartView1_CreateRenderer

        Me.RadChartView1.ShowSmartLabels = True
        Me.RadChartView1.ShowPanZoom = True

        Dim barSeries As New BarSeries()
        Dim barSeries1 As New BarSeries()
        Dim barSeries2 As New BarSeries()
        Dim rand As New Random()
        barSeries.DataPoints.Add(New CategoricalDataPoint(101, 0))
        barSeries1.DataPoints.Add(New CategoricalDataPoint(101, 0))
        barSeries2.DataPoints.Add(New CategoricalDataPoint(101, 0))
        For i As Integer = 1 To 9
            barSeries.DataPoints.Add(New CategoricalDataPoint(rand.[Next](100), i))
            barSeries1.DataPoints.Add(New CategoricalDataPoint(rand.[Next](100), i))
            barSeries2.DataPoints.Add(New CategoricalDataPoint(rand.[Next](100), i))
        Next

        barSeries.ShowLabels = True
        barSeries.DrawLinesToLabels = True
        barSeries1.ShowLabels = True
        barSeries1.DrawLinesToLabels = True
        barSeries2.ShowLabels = True
        barSeries2.DrawLinesToLabels = True

        Me.RadChartView1.Series.Add(barSeries)
        Me.RadChartView1.Series.Add(barSeries1)
        Me.RadChartView1.Series.Add(barSeries2)
    End Sub

    Private Sub radChartView1_CreateRenderer(sender As Object, e As ChartViewCreateRendererEventArgs)
        'e.Renderer = New CustomCartesianRenderer(TryCast(e.Area, CartesianArea))
    End Sub
End Class


Workaround: Create a custom renderer
Public Class CustomCartesianRenderer
    Inherits CartesianRenderer
    Public Sub New(area As CartesianArea)
        MyBase.New(area)
    End Sub

    Protected Overrides Sub Initialize()
        MyBase.Initialize()

        For i As Integer = 0 To Me.DrawParts.Count - 1
            Dim labelPart As BarLabelElementDrawPart = TryCast(Me.DrawParts(i), BarLabelElementDrawPart)
            If labelPart IsNot Nothing Then
                Me.DrawParts(i) = New CustomBarLabelElementDrawPart(DirectCast(labelPart.Element, BarSeries), Me)
            End If
        Next
    End Sub
End Class

Public Class CustomBarLabelElementDrawPart
    Inherits BarLabelElementDrawPart
    Public Sub New(owner As ChartSeries, renderer As IChartRenderer)
        MyBase.New(owner, renderer)
    End Sub

    Public Overrides Sub Draw()
        Dim graphics As Graphics = TryCast(Me.Renderer.Surface, Graphics)
        Dim cartesianSeries As CartesianSeries = TryCast(Me.Element, CartesianSeries)
        If cartesianSeries IsNot Nothing Then
            Dim area As CartesianArea = DirectCast(cartesianSeries.[GetType]().GetField("area", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(cartesianSeries), CartesianArea)
            Dim clipRect As RectangleF = DirectCast(area.[GetType]().GetMethod("GetCartesianClipRect", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(area, New Object() {}), RectangleF)

            graphics.SetClip(clipRect)
        End If

        MyBase.Draw()

        graphics.ResetClip()
    End Sub

    Protected Overrides Function GetLineStart(label As LabelElement, point As DataPointElement, isSmartLabel As Boolean) As PointF
        Dim lineStart As PointF = MyBase.GetLineStart(label, point, isSmartLabel)

        Dim x As Single = CSng(TryCast(Me.Element.View, IChartView).PlotOriginX)
        Dim y As Single = CSng(TryCast(Me.Element.View, IChartView).PlotOriginY)

        lineStart.X += x
        lineStart.Y += y

        Return lineStart
    End Function

    Protected Overrides Function GetLineEnd(label As LabelElement, point As DataPointElement, isSmartLabel As Boolean) As PointF
        Dim lineEnd As PointF = MyBase.GetLineEnd(label, point, isSmartLabel)

        If Not isSmartLabel Then
            Dim x As Single = CSng(TryCast(Me.Element.View, IChartView).PlotOriginX)
            Dim y As Single = CSng(TryCast(Me.Element.View, IChartView).PlotOriginY)
            lineEnd.X += x
            lineEnd.Y += y
        End If

        Return lineEnd
    End Function
End Class
Completed
Last Updated: 18 Aug 2020 09:03 by ADMIN
Release R1 2019
Note: similar to the axis, the series should also have ClipLabels property which will control whether the labels will be clipped or not.

How to reproduce: zoom and pan along the chart
public Form1()
{
    InitializeComponent();

    this.radChartView1.CreateRenderer += radChartView1_CreateRenderer;
    this.radChartView1.ShowPanZoom = true;

    BarSeries barSeries = new BarSeries();
    Random rand = new Random();
    for (int i = 1; i < 10; i++)
    {
        barSeries.DataPoints.Add(new CategoricalDataPoint(rand.Next(100), i));
    }

    barSeries.ShowLabels = true;
    this.radChartView1.Series.Add(barSeries);
}

Workaround:
 public partial class Form1 : Form
 {
     public Form1()
     {
         InitializeComponent();

         this.radChartView1.CreateRenderer += radChartView1_CreateRenderer;
         this.radChartView1.ShowPanZoom = true;

         BarSeries barSeries = new BarSeries();
         Random rand = new Random();
         for (int i = 1; i < 10; i++)
         {
             barSeries.DataPoints.Add(new CategoricalDataPoint(rand.Next(100), i));
         }

         barSeries.ShowLabels = true;
         this.radChartView1.Series.Add(barSeries);
     }

     private void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
     {
         e.Renderer = new CustomCartesianRenderer(e.Area as CartesianArea);
     }
 }

 public class CustomCartesianRenderer : CartesianRenderer
 {
     public CustomCartesianRenderer(CartesianArea area)
         : base(area)
     { }
     protected override void Initialize()
     {
         base.Initialize();

         for (int i = 0; i < this.DrawParts.Count; i++)
         {
             BarLabelElementDrawPart labelPart = this.DrawParts[i] as BarLabelElementDrawPart;
             if (labelPart != null)
             {
                 this.DrawParts[i] = new CustomLabelElementDrawPart((BarSeries)labelPart.Element, this);
             }
         }
     }
 }

 public class CustomLabelElementDrawPart : BarLabelElementDrawPart
 {
     public CustomLabelElementDrawPart(ChartSeries owner, IChartRenderer renderer)
         : base(owner, renderer)
     { }
     
     public override void Draw()
     {
         Graphics graphics = this.Renderer.Surface as Graphics;
         CartesianSeries cartesianSeries = this.Element as CartesianSeries;
         if (cartesianSeries != null)
         {
             CartesianArea area = (CartesianArea)cartesianSeries.GetType().GetField("area", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cartesianSeries);
             RectangleF clipRect = (RectangleF)area.GetType().GetMethod("GetCartesianClipRect", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(area, new object[] { });//.GetCartesianClipRect();
             graphics.SetClip(clipRect);
         }

         base.Draw();

         graphics.ResetClip();
     }
 }
Completed
Last Updated: 07 Dec 2016 08:41 by ADMIN
To reproduce:
- Add at least two series and zoom the chart so the point from one of the series are visible only
- Move the TrackBall
- The Track ball is not shown for some of the points.