Unplanned
Last Updated: 11 Jul 2016 08:40 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: ChartView
Type: Feature Request
2
Note: when you apply a palette the series doesn't have hover and selection indication.
Completed
Last Updated: 09 Nov 2016 08:18 by ADMIN
How to reproduce:
Dim table As New DataTable()
table.Columns.Add("Name", GetType(String))
table.Columns.Add("X", GetType(Integer))
 
For i As Integer = 0 To 99
    table.Rows.Add($"User {i}", i)
Next
 
Dim series As New BarSeries()
series.DataSource = table
series.CategoryMember = "Name"
series.ValueMember = "X"
 
RadChartView1.Series.Add(series)
 
CType(RadChartView1.Area, CartesianArea).Orientation = Orientation.Horizontal
         
Dim panZoomController As New ChartPanZoomController()
panZoomController.PanZoomMode = ChartPanZoomMode.Vertical
RadChartView1.Controllers.Add(panZoomController)
 
RadChartView1.Zoom(1, 8)

Workaround: create a custom ChartPanZoomController
Dim panZoomController As New MyChartPanZoomController()
panZoomController.PanZoomMode = ChartPanZoomMode.Vertical
RadChartView1.Controllers.Add(panZoomController)

Public Class MyChartPanZoomController
    Inherits ChartPanZoomController

    Protected Overrides Function OnMouseMove(e As MouseEventArgs) As ActionResult

        Dim cartesianArea As CartesianArea = TryCast(Me.Area, CartesianArea)
        If cartesianArea Is Nothing Then
            Return MyBase.OnMouseMove(e)
        End If

        Dim panPoint As Point? = Me.GetType().BaseType.GetField("panPoint", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me)

        If e.Button = MouseButtons.Left AndAlso panPoint.HasValue Then
            Dim offsetX As Double = Me.GetType().BaseType.GetField("offsetX", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me)

            Dim currentOffsetX As Double = offsetX
            Dim defaultAxis As Axis = If(cartesianArea.Orientation = Orientation.Horizontal,
                                         Me.Area.GetType().GetMethod("GetDefaultFirstAxis", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(Me.Area, New Object() {}),
                                         Me.Area.GetType().GetMethod("GetDefaultSecondAxis", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(Me.Area, New Object() {}))

            If Me.PanZoomMode = ChartPanZoomMode.Horizontal OrElse Me.PanZoomMode = ChartPanZoomMode.Both Then
                currentOffsetX += (panPoint.Value.X - e.Location.X) * -1

                If currentOffsetX > 0 Then
                    currentOffsetX = 0
                End If

                If currentOffsetX < defaultAxis.Model.LayoutSlot.Width * (DirectCast(cartesianArea.View, IChartView).ZoomWidth - 1) Then
                    currentOffsetX = -defaultAxis.Model.LayoutSlot.Width * (DirectCast(cartesianArea.View, IChartView).ZoomWidth - 1)
                End If
            End If

            Dim offsetY As Double = Me.GetType().BaseType.GetField("offsetY", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me)
            Dim currentOffsetY As Double = offsetY
            If Me.PanZoomMode = ChartPanZoomMode.Vertical OrElse Me.PanZoomMode = ChartPanZoomMode.Both Then
                currentOffsetY += (panPoint.Value.Y - e.Location.Y) * -1

                If currentOffsetY > 0 Then
                    currentOffsetY = 0
                End If

                If currentOffsetY < -defaultAxis.Model.LayoutSlot.Height * (DirectCast(cartesianArea.View, IChartView).ZoomHeight - 1) Then
                    currentOffsetY = -defaultAxis.Model.LayoutSlot.Height * (DirectCast(cartesianArea.View, IChartView).ZoomHeight - 1)
                End If
            End If

            cartesianArea.View.Pan(currentOffsetX, currentOffsetY)
        End If

        Return Controller.Empty

    End Function

End Class
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: 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;
        }
    }
}
Unplanned
Last Updated: 15 Jun 2017 12:41 by ADMIN
ADMIN
Created by: Dimitar
Comments: 0
Category: ChartView
Type: Feature Request
2

			
Declined
Last Updated: 15 Aug 2017 13:11 by ADMIN
Use LogarithmicAxis and set the Minimum to 0.1

Workaround is availble in the atched project.
Unplanned
Last Updated: 30 Apr 2018 10:46 by ADMIN
Created by: promat
Comments: 1
Category: ChartView
Type: Feature Request
2
It would be great to be able to generate Box Plot graphics, both in the RadCharView control and in the Report.
Completed
Last Updated: 18 Jun 2018 14:35 by Nathan
ADMIN
Created by: Hristo
Comments: 5
Category: ChartView
Type: Feature Request
2
The new controller should allow lasso selection of data points without zooming the view port.
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: 23 Nov 2018 11:34 by Dimitar
To reproduce:
            WaterfallSeries series = new WaterfallSeries();
            series.ShowLabels = true;

            series.DataPoints.Add(new WaterfallDataPoint(50000, false, false, "Beginning\nBalance"));
            series.DataPoints.Add(new WaterfallDataPoint(17000, false, false, "Jan"));
            series.DataPoints.Add(new WaterfallDataPoint(14000, false, false, "Feb"));
            series.DataPoints.Add(new WaterfallDataPoint(-12000, false, false, "Mar"));
            series.DataPoints.Add(new WaterfallDataPoint(69000, true, false, "Q1"));
            series.DataPoints.Add(new WaterfallDataPoint(-22000, false, false, "Apr"));
            series.DataPoints.Add(new WaterfallDataPoint(-18000, false, false, "May"));
            series.DataPoints.Add(new WaterfallDataPoint(500, false, false, "Jun"));
            series.DataPoints.Add(new WaterfallDataPoint(-30000, true, false, "Q2"));
            series.DataPoints.Add(new WaterfallDataPoint(39000, false, true, "Ending\nBalance"));
            this.radChartView1.Series.Add(series);

            CartesianGridLineAnnotation annotation1 = new CartesianGridLineAnnotation();
            annotation1.Label = "Annotation";
            annotation1.ForeColor = Color.Lime;
            annotation1.BackColor = Color.Black;
            this.radChartView1.Annotations.Add(annotation1);

Workaround:

        public RadForm1()
        {
            InitializeComponent();
            this.radChartView1.CreateRenderer += radChartView1_CreateRenderer;

            WaterfallSeries series = new WaterfallSeries();
            series.ShowLabels = true;
     
            series.DataPoints.Add(new WaterfallDataPoint(50000, false, false, "Beginning\nBalance"));
            series.DataPoints.Add(new WaterfallDataPoint(17000, false, false, "Jan"));
            series.DataPoints.Add(new WaterfallDataPoint(14000, false, false, "Feb"));
            series.DataPoints.Add(new WaterfallDataPoint(-12000, false, false, "Mar"));
            series.DataPoints.Add(new WaterfallDataPoint(69000, true, false, "Q1"));
            series.DataPoints.Add(new WaterfallDataPoint(-22000, false, false, "Apr"));
            series.DataPoints.Add(new WaterfallDataPoint(-18000, false, false, "May"));
            series.DataPoints.Add(new WaterfallDataPoint(500, false, false, "Jun"));
            series.DataPoints.Add(new WaterfallDataPoint(-30000, true, false, "Q2"));
            series.DataPoints.Add(new WaterfallDataPoint(39000, false, true, "Ending\nBalance"));
            this.radChartView1.Series.Add(series);
 
            CartesianGridLineAnnotation annotation1 = new CartesianGridLineAnnotation();
            annotation1.Label = "Annotation";
            annotation1.ForeColor = Color.Lime;
            annotation1.BackColor = Color.Black;
            annotation1.PositonOffset = new SizeF(0, -20);
            annotation1.Axis = this.radChartView1.Axes[1] as CartesianAxis;
            annotation1.Value = 70000;
            annotation1.BorderColor = Color.Red;
            annotation1.BorderDashStyle = DashStyle.Solid;
            annotation1.BorderWidth = 1;
            this.radChartView1.Annotations.Add(annotation1);
        }

        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 - 1; i++)
                {
                    CartesianGridLineAnnotationDrawPart annotationPart = this.DrawParts[i] as CartesianGridLineAnnotationDrawPart;
                    if (annotationPart != null)
                    {
                        this.DrawParts[i] = new CustomCartesianGridLineAnnotationDrawPart((CartesianGridLineAnnotation)annotationPart.Element, this);
                    }
                }
            }
        }

        public class CustomCartesianGridLineAnnotationDrawPart : CartesianGridLineAnnotationDrawPart
        {
            public CustomCartesianGridLineAnnotationDrawPart(CartesianGridLineAnnotation element, CartesianRenderer renderer) : base(element, renderer)
            {
            }

            public override void Draw()
            {
                FieldInfo fi = typeof(CartesianGridLineAnnotation).GetField("model", BindingFlags.NonPublic | BindingFlags.Instance);
                ChartAnnotationModel model = fi.GetValue(this.Element) as ChartAnnotationModel;
                RectangleF
                rect = ChartRenderer.ToRectangleF(model.LayoutSlot);
                rect.Offset(this.ViewportOffsetX, this.ViewportOffsetY);

                Graphics graphics = this.Renderer.Surface as Graphics;
                RadGdiGraphics radGraphics = new RadGdiGraphics(graphics);

                Rectangle 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;

                FillPrimitiveImpl fill = new FillPrimitiveImpl(this.Element, null);
                fill.PaintFill(radGraphics, null, rect);
            
                TextPrimitiveHtmlImpl text = new TextPrimitiveHtmlImpl();
                text.PaintPrimitive(radGraphics, 0f, new SizeF(1f, 1f), tp);
            }
        }
Completed
Last Updated: 10 Jun 2014 10:50 by ADMIN
ADMIN
Created by: Nikolay
Comments: 0
Category: ChartView
Type: Bug Report
1
RadChartView should have empty values support just like RadChart had it.
Completed
Last Updated: 05 Jun 2014 07:08 by ADMIN
Currently, there seems to be no convenient API for formatting data point elements. There is a CreatePointElement event, which however does not work properly.
Completed
Last Updated: 12 Jun 2014 11:35 by ADMIN
Steps to reproduce:

1. Clear all series and axes from a chart
2. Create new axes and series and databind the series
3. Add the new series and axes to the chart
4. Repeat the steps above multiple times
Completed
Last Updated: 12 Mar 2013 04:18 by ADMIN
ADMIN
Created by: Ivan Petrov
Comments: 0
Category: ChartView
Type: Bug Report
1
If one sets the LabelFormat property of LinearAxis it will not be respected in most cases.
Steps to reproduce:
1. Add a LineSeries to a chart
2. Set the VerticalAxis.LabelFormat to "{0:F2}"
3. Run the project
You will see that the labels are not formatted.
Completed
Last Updated: 29 Jan 2013 01:17 by ADMIN
Steps to reproduce:
1. Set up a pie chart with several segments
2. Set ShowTrackBall property to true
3. Run the project and hover a segment An ArgumentOutOfRange exception will be thrown.
Completed
Last Updated: 20 Mar 2015 14:41 by ADMIN
Steps to reproduce:
1. Add a pie series to a chart 
2. add three data points with values 19,20 and 61
3. Set the series LabelsOffsetFromCenter property to 0.2d
4. Run the project and start reducing the size of the chart. At some point you will see that the position of the label 20% will be incorrect.

Second scenario:
Add a pie chart and populate it with PieDataPoints, one of which is with value 0:

        Me.RadChartView1.AreaType = ChartAreaType.Pie
        Dim series As New PieSeries()
        series.DataPoints.Add(New PieDataPoint(50, "Germany"))
        series.DataPoints.Add(New PieDataPoint(70, "United States"))
        series.DataPoints.Add(New PieDataPoint(40, "France"))
        series.DataPoints.Add(New PieDataPoint(25, "United Kingdom"))
        series.DataPoints.Add(New PieDataPoint(0, "Italy"))
        series.ShowLabels = True
        Me.RadChartView1.Series.Add(series)
Completed
Last Updated: 05 Feb 2015 17:59 by ADMIN
RadChartView - user should be able to enter minimum/maximum width for Bars in BarSeries.
Completed
Last Updated: 10 Oct 2014 12:57 by ADMIN
RadChartView - Palette of the Series should be with higher priority than Area.View.Palette.
Completed
Last Updated: 20 Oct 2014 12:05 by ADMIN
SmartLabelsController - PieTwoLabelColumnsStrategy throws exception if the series has two or more DataPoints with value "0";

Code to reproduce:
            RadChartView pieChart = new RadChartView();

            pieChart.AreaType = ChartAreaType.Pie;
   
Completed
Last Updated: 14 May 2014 11:12 by ADMIN
RadChartView - DateTimeContinueAxis ignores the MaximumTicks property with some specific data points. 

Steps to reproduce:
Use the following points:
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2007, 7, 24)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2007, 10, 30)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2008, 4, 29)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2008, 10, 27)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2009, 4, 1)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2010, 6, 28)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2010, 10, 7)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2011, 4, 19)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2011, 9, 27)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2012, 1, 10)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2012, 4, 11)));
            points.Add(new CategoricalDataPoint(r.Next(0, 100), new DateTime(2012, 10, 16)));