Use attached to reproduce.
Workaround:
series.DataPoints.Add(new PieDataPoint(0.01, "Germany"));
After 1 million the decimal places of the labels are not correct, In your image. the labels on the horizontal axis go 999,992.50 - 999,995.00 - 999,997.5 - 1,000,000.00 - *1,000,003.00(should be 1,000,002.50) - 1,000,005.00 - *1,000,008.00(should be 1,000,007.5)
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); } }
To reproduce: - Add a chart to the form and set series with DataSource - Close and dispose the form Workaround: Set the DataSource property of the series to null prior closing.
To reproduce: please refer to the attached sample project and gif file illustrating the behavior on my end. Note: similar to the axis, the series should also have ClipLabels property which will control whether the labels will be clipped or not. Workaround: use custom renderer: Sub New() InitializeComponent() AddHandler Me.RadChartView1.CreateRenderer, AddressOf RadChartView1_CreateRenderer Dim barSeries As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName") barSeries.Name = "Q1" barSeries.ShowLabels = True barSeries.DataPoints.Add(New CategoricalDataPoint(177, "Harley")) barSeries.DataPoints.Add(New CategoricalDataPoint(128, "White")) barSeries.DataPoints.Add(New CategoricalDataPoint(143, "Smith")) barSeries.DataPoints.Add(New CategoricalDataPoint(111, "Jones")) barSeries.DataPoints.Add(New CategoricalDataPoint(118, "Marshall")) Me.RadChartView1.Series.Add(barSeries) Dim barSeries2 As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName") barSeries2.Name = "Q2" barSeries2.ShowLabels = True barSeries2.DataPoints.Add(New CategoricalDataPoint(153, "Harley")) barSeries2.DataPoints.Add(New CategoricalDataPoint(141, "White")) barSeries2.DataPoints.Add(New CategoricalDataPoint(130, "Smith")) barSeries2.DataPoints.Add(New CategoricalDataPoint(88, "Jones")) barSeries2.DataPoints.Add(New CategoricalDataPoint(109, "Marshall")) Me.RadChartView1.Series.Add(barSeries2) Dim lassoZoomController As New ChartPanZoomController() RadChartView1.Controllers.Add(lassoZoomController) End Sub Public Class CustomLabelElementDrawPart Inherits BarLabelElementDrawPart Public Sub New(owner As ChartSeries, renderer As IChartRenderer) MyBase.New(owner, renderer) End Sub Public Overrides Sub Draw() If Not Me.Element.ShowLabels Then Return End If Dim graphics As Graphics = TryCast(Me.Renderer.Surface, Graphics) Dim radGraphics As RadGdiGraphics = New RadGdiGraphics(graphics) Dim isSmartLabelsEnabled As Boolean = Me.Element.View.ShowSmartLabels Dim isLineToLabelEnabled As Boolean = Me.Element.DrawLinesToLabels For Each dataPointElement As DataPointElement In Me.Element.Children Dim categoricalDataPoint As CategoricalDataPoint = TryCast(dataPointElement.DataPoint, CategoricalDataPoint) For i As Integer = 0 To dataPointElement.Children.Count - 1 Dim labelElement As LabelElement = TryCast(dataPointElement.Children(i), LabelElement) If labelElement Is Nothing Then Continue For End If labelElement.OnLabelFormatting(New ChartViewLabelFormattingEventArgs(labelElement)) If Not labelElement.IsVisible OrElse String.IsNullOrEmpty(labelElement.Text) Then Continue For End If Dim rect As Rectangle Dim slot As RadRect = labelElement.GetLayoutSlot() If isSmartLabelsEnabled AndAlso labelElement.SmartRectangle <> Rectangle.Empty Then rect = labelElement.SmartRectangle Else slot = AdjustLayoutSlot(slot, labelElement.DataPointElement) rect = ChartRenderer.ToRectangle(slot) End If Dim state As Object = radGraphics.SaveState() Dim horizontalTranslate As Integer = rect.X + rect.Width / 2 Dim verticalTranslate As Integer = rect.Y + rect.Height / 2 Dim clipRect As RectangleF If TypeOf Me.Renderer Is CartesianRenderer Then Dim size As SizeF = graphics.MeasureString("W", Me.Element.Font) Dim plotRect As RadRect = Me.Element.Model.LayoutSlot plotRect.X += Me.ViewportOffsetX plotRect.Y += Me.ViewportOffsetY clipRect = ChartRenderer.ToRectangleF(plotRect) clipRect.Y -= size.Height / 2.0F clipRect.Height += size.Height clipRect.Width += size.Width * 2.0F graphics.SetClip(clipRect) End If Dim angle As Single = CSng(Me.Element.LabelRotationAngle) Mod 360.0F If angle <> 0 Then radGraphics.TranslateTransform(horizontalTranslate, verticalTranslate) radGraphics.RotateTransform(angle) radGraphics.TranslateTransform(-horizontalTranslate, -verticalTranslate) End If If isLineToLabelEnabled Then Me.DrawConnectingLine(radGraphics, labelElement, dataPointElement, isSmartLabelsEnabled AndAlso labelElement.SmartRectangle <> Rectangle.Empty) End If If labelElement.BackgroundShape IsNot Nothing Then labelElement.BackgroundShape.Paint(CType(radGraphics.UnderlayGraphics, Graphics), rect) End If Dim fill As Telerik.WinControls.Primitives.FillPrimitiveImpl = New Telerik.WinControls.Primitives.FillPrimitiveImpl(labelElement, Nothing) fill.PaintFill(radGraphics, 0, System.Drawing.Size.Empty, rect) Dim border As Telerik.WinControls.Primitives.BorderPrimitiveImpl = New Telerik.WinControls.Primitives.BorderPrimitiveImpl(labelElement, Nothing) border.PaintBorder(radGraphics, 0, System.Drawing.Size.Empty, rect) Using brush As Brush = New SolidBrush(labelElement.ForeColor) Dim drawRectangle As RectangleF = New RectangleF() drawRectangle.X = rect.X + labelElement.Padding.Left drawRectangle.Y = rect.Y + labelElement.Padding.Top drawRectangle.Width = rect.Width - labelElement.Padding.Right drawRectangle.Height = rect.Height - labelElement.Padding.Bottom Dim format As StringFormat = New StringFormat() format.Alignment = ContentAlignmentToHorizontalStringAlignment(labelElement.TextAlignment) format.LineAlignment = Me.ContentAlignmentToVerticalStringAlignment(labelElement.TextAlignment) graphics.DrawString(labelElement.Text, labelElement.Font, brush, drawRectangle, format) End Using If angle <> 0 Then radGraphics.ResetTransform() radGraphics.RestoreState(state) End If graphics.ResetClip() Next Next End Sub Public Function ContentAlignmentToVerticalStringAlignment(ByVal contentAlignment As ContentAlignment) As StringAlignment Dim result As StringAlignment Select Case contentAlignment Case contentAlignment.BottomCenter, contentAlignment.BottomLeft, contentAlignment.BottomRight result = StringAlignment.Far Case contentAlignment.TopCenter, contentAlignment.TopLeft, contentAlignment.TopRight result = StringAlignment.Near Case Else result = StringAlignment.Center End Select Return result End Function Private Function ContentAlignmentToHorizontalStringAlignment(ByVal contentAlignment As ContentAlignment) As StringAlignment Dim result As StringAlignment Select Case contentAlignment Case contentAlignment.BottomLeft, contentAlignment.MiddleLeft, contentAlignment.TopLeft result = StringAlignment.Near Case contentAlignment.BottomRight, contentAlignment.MiddleRight, contentAlignment.TopRight result = StringAlignment.Far Case Else result = StringAlignment.Center End Select Return result End Function End Class Private Sub RadChartView1_CreateRenderer(sender As Object, e As ChartViewCreateRendererEventArgs) e.Renderer = New CustomCartesianRenderer(e.Area) End Sub 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 label As BarLabelElementDrawPart = TryCast(Me.DrawParts(i), BarLabelElementDrawPart) If (label IsNot Nothing) Then Me.DrawParts(i) = New CustomLabelElementDrawPart(label.Element, Me) End If Next End Sub End Class
How to reproduce: private void UpdateChart() { this.radChartView1.Series.Clear(); // Create two series for the bar chart. BarSeries requiredBarSeries = new BarSeries { ShowLabels = true, CombineMode = ChartSeriesCombineMode.Cluster, NumberOfColors = 2, }; BarSeries actualBarSeries = new BarSeries { ShowLabels = true, CombineMode = ChartSeriesCombineMode.Cluster, NumberOfColors = 2, }; // Add the data. AddDataPoint(requiredBarSeries, .0333d, "Germany", "Required"); AddDataPoint(actualBarSeries, .050d, "Germany", "Actual"); AddDataPoint(requiredBarSeries, .0333d, "United States", "Required"); AddDataPoint(actualBarSeries, .050d, "United States", "Actual"); AddDataPoint(requiredBarSeries, .00d, "France", "Required"); AddDataPoint(actualBarSeries, .050d, "France", "Actual"); AddDataPoint(requiredBarSeries, 0.0d, "United Kingdom", "Required"); AddDataPoint(actualBarSeries, .050d, "United Kingdom", "Actual"); AddDataPoint(requiredBarSeries, 0.955d, "Russia", "Required"); // Change the following value to .95d to see // the issue. AddDataPoint(actualBarSeries, .15d, "Russia", "Actual"); this.radChartView1.Series.Add(requiredBarSeries); this.radChartView1.Series.Add(actualBarSeries); CategoricalAxis horizontalAxis = radChartView1.Axes[0] as CategoricalAxis; horizontalAxis.LabelFitMode = AxisLabelFitMode.MultiLine; } private void AddDataPoint(BarSeries series, double val, string category, string label) { series.DataPoints.Add(new CategoricalDataPoint { Value = val, Label = String.Format("{0}\n{1:P2}", label, val), Category = category }); } Workaround: create a custom SmartLabelsController public RadForm1() { InitializeComponent(); SmartLabelsController labelsController = new CustomSmartLabelsController(); this.radChartView1.Controllers.Add(labelsController); // Set up the chart } public class CustomSmartLabelsController : SmartLabelsController { protected override SmartLabelsStrategyBase GetDefaultStrategy(ChartArea area) { SmartLabelsStrategyBase strategy = base.GetDefaultStrategy(area); if (strategy is VerticalAdjusmentLabelsStrategy) { strategy = new CustomVerticalAdjusmentLabelsStrategy(); Dictionary<Type, List<Type>> strategies = typeof(SmartLabelsController).GetField("strategySeries", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(this) as Dictionary<Type, List<Type>>; strategies.Remove(typeof(VerticalAdjusmentLabelsStrategy)); strategies.Add(typeof(CustomVerticalAdjusmentLabelsStrategy), new List<Type> { typeof(BarSeries), typeof(LineSeriesBase) }); } return strategy; } } public class CustomVerticalAdjusmentLabelsStrategy : VerticalAdjusmentLabelsStrategy { public override void CalculateLocations(ChartSeriesCollection series, Rectangle plotArea) { if (series.Count == 0) { return; } List<LabelElement> labels = new List<LabelElement>(); List<int> overlaps = new List<int>(); foreach (ChartSeries chartSeries in series) { if (!chartSeries.ShowLabels || !chartSeries.IsVisible) { continue; } foreach (DataPointElement point in chartSeries.Children) { LabelElement label = (LabelElement)point.Children[0]; Rectangle labelRect = ChartRenderer.ToRectangle(label.GetLayoutSlot()); labelRect.X += (int)(series[0].View.Viewport.X + ((IChartView)series[0].View).PlotOriginX); labelRect.Y += (int)(series[0].View.Viewport.Y + ((IChartView)series[0].View).PlotOriginY); if (chartSeries.View.GetArea<CartesianArea>().Orientation == Orientation.Vertical) { labelRect.Y -= this.DistanceToLabel; } else { labelRect.X += this.DistanceToLabel; } labelRect.Inflate(0, this.DistanceBetweenLabels); label.SmartRectangle = labelRect; labels.Add(label); } } CartesianSeries cartesianSeries = (CartesianSeries)series[0]; if (cartesianSeries != null) { this.RestrictWithinAxes(labels, cartesianSeries); } LabelElement labelToMove = this.GetElementWithMostOverlaps(labels, series); int counter = 0; while (labelToMove != null && counter < labels.Count) { Rectangle firstDirectionRect; Rectangle secondDirectionRect; int firstMoveCost; int secondMoveCost; Rectangle dataPointLayout = ChartRenderer.ToRectangle(labelToMove.DataPoint.LayoutSlot); dataPointLayout.X += (int)labelToMove.View.Viewport.X; dataPointLayout.Y += (int)labelToMove.View.Viewport.Y; if (cartesianSeries.View.GetArea<CartesianArea>().Orientation == System.Windows.Forms.Orientation.Vertical) { firstDirectionRect = this.GetBestPositionInUpwardDirection(labels, labelToMove, cartesianSeries); secondDirectionRect = this.GetBestPositionInDownwardDirection(labels, labelToMove, cartesianSeries); firstMoveCost = Math.Abs(labelToMove.SmartRectangle.Y - firstDirectionRect.Y); secondMoveCost = Math.Abs(labelToMove.SmartRectangle.Y - secondDirectionRect.Y); } else { firstDirectionRect = this.GetBestPositionInLeftDirection(labels, labelToMove, cartesianSeries); secondDirectionRect = this.GetBestPositionInRightDirection(labels, labelToMove, cartesianSeries); firstMoveCost = Math.Abs(dataPointLayout.X - firstDirectionRect.X); secondMoveCost = Math.Abs(dataPointLayout.X - secondDirectionRect.X); } if (!dataPointLayout.IntersectsWith(secondDirectionRect) && firstMoveCost > secondMoveCost) { labelToMove.SmartRectangle = secondDirectionRect; } else { labelToMove.SmartRectangle = firstDirectionRect; } labelToMove = this.GetElementWithMostOverlaps(labels, series); counter++; } this.FinalPositionsOptimization(labels); foreach (LabelElement label in labels) { Rectangle rect = label.SmartRectangle; rect.Inflate(0, -this.DistanceBetweenLabels); Rectangle dataPointLayout = ChartRenderer.ToRectangle(label.DataPoint.LayoutSlot); dataPointLayout.X += (int)cartesianSeries.View.Viewport.X; dataPointLayout.Y += (int)cartesianSeries.View.Viewport.Y; int delta = 1; if (dataPointLayout.Y > label.SmartRectangle.Y) { delta = -1; } rect.Y += delta * this.DistanceToLabel; label.SmartRectangle = rect; } } }
Use attached to reproduce (comment the custom strategy). Workaround: in the attched project.
To reproduce: run the attached sample project and you will notice that the data points are not properly aligned. Workaround: use equal number of data points for the series.
How to reproduce: the issue can be observed when opening a form with a RadChartView which is not visible located in RadScrollablePanel. The panel will scroll to the chart which is not desired Workaround: public partial class RadForm1 : Telerik.WinControls.UI.RadForm { public RadForm1() { InitializeComponent(); this.radScrollablePanel1.AllowAutomaticScrollToControl = false; } protected override void OnVisibleChanged(EventArgs e) { base.OnVisibleChanged(e); this.radScrollablePanel1.HorizontalScrollbar.Value = 0;; } }
How to reproduce: Check the attached project Workaround: Create a separate custom MACD indicator and add it to the chart, uncomment the commented code in the attached project Friend Class MacdCustomIndicator Inherits MacdIndicator Private customBorderColor As Color Public Property BorderColor() As Color Get Return customBorderColor End Get Set(ByVal value As Color) customBorderColor = value Me.ChildIndicator.BorderColor = value End Set End Property Sub New() Dim customMacdInnerIndicator = New CustomMacdInnerIndicator(Me) Me.GetType().BaseType.GetField("childIndicator", BindingFlags.Instance Or BindingFlags.NonPublic).SetValue(Me, customMacdInnerIndicator) End Sub End Class Friend Class CustomMacdInnerIndicator Inherits MacdInnerIndicator Public Sub New(owner As MacdIndicator) MyBase.New(owner) End Sub Public Overrides Function GetProcessedValue(currentIndex As Integer) As Double Dim macd As Double = Me.CalculateMacdValue(currentIndex, LongPeriod, ShortPeriod) Me.Cache(macdValues).Add(currentIndex, macd) Return macd End Function End Class
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;
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; } }
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; } }
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; } }
Use attached to reproduce. If you add 163 points the axis will start from 3. There should be an option to start from 0.
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;
To reproduce: public RadForm1() { InitializeComponent(); this.radChartView1.AreaType = ChartAreaType.Polar; PolarAreaSeries polarAreaSeries = new PolarAreaSeries(); PolarDataPoint polarPoint = new PolarDataPoint(); polarPoint.Value = 35; polarPoint.Angle = 50; polarAreaSeries.DataPoints.Add(polarPoint); polarPoint = new PolarDataPoint(); polarPoint.Value = 40; polarPoint.Angle = 200; polarAreaSeries.DataPoints.Add(polarPoint); polarPoint = new PolarDataPoint(); polarPoint.Value = 55; polarPoint.Angle = 320; polarAreaSeries.DataPoints.Add(polarPoint); this.radChartView1.Series.Add(polarAreaSeries); this.radChartView1.Axes[0].LabelFitMode = AxisLabelFitMode.Rotate; AxisLabelElement gauche = this.radChartView1.Axes[0].Children[1] as AxisLabelElement; gauche.Text = "IV Gestion des ressources" + Environment.NewLine + "humaines"; this.radChartView1.View.AxisLabelFormatting+=View_AxisLabelFormatting; } Font f = new Font("Arial", 10, FontStyle.Bold); private void View_AxisLabelFormatting(object sender, ChartAxisLabelFormattingEventArgs e) { if (e.LabelElement.Text.Contains("IV")) { e.LabelElement.Font = f; } }
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); } }
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(); }
Workaround: public class MyRadChartView : RadChartView { public override string ThemeClassName { get { return typeof(RadChartView).FullName; } } protected override void Dispose(bool disposing) { base.Dispose(false); } }