This is a migrated thread and some comments may be shown as answers.

Crash in RadCartesianChart

5 Answers 149 Views
ChartView
This is a migrated thread and some comments may be shown as answers.
Rob
Top achievements
Rank 1
Rob asked on 24 Mar 2015, 03:05 PM
Hi,

I'm experiencing crash in my RadCartesianChart. I have a databound grid showing the source data, I also have a RadCartesianChart with a ScatterLineSeries showing a graphical representation of this data. The ScatterLineSeries I create and add to the chart in code.

When I delete rows from the grid, the points are also removed from the chart, as expected.

After I make certain changes, I wish to clear the chart and draw the series again, to do this I call RadCartesianChart.Series.Clear() and recreate the series once again. Once I've done this however, if I delete an entry in the grid I experience a crash with the error....

An unhandled exception of type 'System.ArgumentException' occurred in Telerik.Windows.Controls.Chart.dll

Additional information: The provided node does exist in this collection.

Am I clearing out the series correctly when I reset the chart?

I have produced a small test app to demonstrate this behaviour available on request.

Here is the stack trace.

    at Telerik.Charting.NodeCollection.Remove(ChartNode node)
   at Telerik.Charting.ElementCollection`1.RemoveItem(Int32 index)
   at System.Collections.ObjectModel.Collection`1.RemoveAt(Int32 index)
   at Telerik.Charting.DataPointCollection`1.System.Collections.Generic.IList<Telerik.Charting.DataPoint>.RemoveAt(Int32 index)
   at Telerik.Windows.Controls.ChartView.ChartSeriesDataSource.PerformRemove(Object removedDataItem, Int32 removedItemIndex)
   at Telerik.Windows.Controls.ChartView.ChartSeriesDataSource.HandleItemRemove(NotifyCollectionChangedEventArgs e)
   at Telerik.Windows.Controls.ChartView.ChartSeriesDataSource.OnSourceCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
   at System.Collections.ObjectModel.ObservableCollection`1.RemoveItem(Int32 index)
   at System.Collections.ObjectModel.Collection`1.Remove(T item)
   at System.Collections.ObjectModel.Collection`1.System.Collections.IList.Remove(Object value)
   at Telerik.Windows.Data.QueryableCollectionView.RemoveItemFromSourceList(IList list, Object removedItem)
   at Telerik.Windows.Data.QueryableCollectionView.RemoveItemFromSource(Object removedItem)
   at Telerik.Windows.Data.QueryableCollectionView.Remove(Object item)
   at Telerik.Windows.Data.DataItemCollection.Remove(Object item)
   at Telerik.Windows.Controls.GridView.GridViewDataControl.DeleteItems(IEnumerable`1 itemsToDelete)
   at Telerik.Windows.Controls.GridView.GridViewDataControl.DeleteSelectedItems()
   at Telerik.Windows.Controls.GridView.GridViewDataControl.TryDeleteSelectedItems()
   at Telerik.Windows.Controls.GridView.GridViewDataControl.OnDeleteCommand(Object sender, ExecutedRoutedEventArgs e)
   at System.Windows.Input.CommandBinding.OnExecuted(Object sender, ExecutedRoutedEventArgs e)
   at System.Windows.Input.CommandManager.ExecuteCommandBinding(Object sender, ExecutedRoutedEventArgs e, CommandBinding commandBinding)
   at System.Windows.Input.CommandManager.FindCommandBinding(Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
   at System.Windows.Input.CommandManager.OnExecuted(Object sender, ExecutedRoutedEventArgs e)
   at System.Windows.UIElement.OnExecutedThunk(Object sender, ExecutedRoutedEventArgs e)
   at System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler(Delegate genericHandler, Object target)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   at System.Windows.Input.RoutedCommand.ExecuteImpl(Object parameter, IInputElement target, Boolean userInitiated)
   at System.Windows.Input.RoutedCommand.Execute(Object parameter, IInputElement target)
   at Telerik.Windows.Controls.GridView.GridViewDataControl.ExecutePendingCommand()
   at Telerik.Windows.Controls.GridView.GridViewDataControl.PendAndExecuteCommands(KeyEventArgs e)
   at Telerik.Windows.Controls.GridView.GridViewDataControl.OnKeyDown(KeyEventArgs e)
   at System.Windows.UIElement.OnKeyDownThunk(Object sender, KeyEventArgs e)
   at System.Windows.Input.KeyEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawKeyboardActions actions, Int32 scanCode, Boolean isExtendedKey, Boolean isSystemKey, Int32 virtualKey)
   at System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(MSG& msg, Boolean& handled)
   at System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(MSG& msg, ModifierKeys modifiers)
   at System.Windows.Interop.HwndSource.OnPreprocessMessage(Object param)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   at System.Windows.Interop.HwndSource.OnPreprocessMessageThunk(MSG& msg, Boolean& handled)
   at System.Windows.Interop.HwndSource.WeakEventPreprocessMessage.OnPreprocessMessage(MSG& msg, Boolean& handled)
   at System.Windows.Interop.ComponentDispatcherThread.RaiseThreadMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()

Thanks,

Rob
 

5 Answers, 1 is accepted

Sort by
0
Petar Marchev
Telerik team
answered on 25 Mar 2015, 12:25 PM
Hi Rob,

Thank you for the explanations and the stack trace. I think that you get an exception in the series you have removed. The series is incapable of tracking the ItemsSource udpates because it is no longer attached to a chart. I suspect that you are manually binding the series, manually setting the ItemsSource. When you remove the series from the chart, the ItemsSource does not get automatically cleared, you need to set it to null, otherwise you may get a memory leak.

Keep in mind that this is just a hunch because we do not have a project to reproduce and investigate this. However, do try to set the ItemsSource to null and let us know how it goes. If you keep experiencing issues with this I will ask that you provide a small project that reproduces this glitch.

Regards,
Petar Marchev
Telerik
 

See What's Next in App Development. Register for TelerikNEXT.

 
0
Robert
Top achievements
Rank 1
answered on 26 Mar 2015, 08:36 AM
Hi, this has fixed the problem.

Thanks for the help, it's much appreciated.
0
Petar Marchev
Telerik team
answered on 27 Mar 2015, 10:02 AM
Hi Robert,

We are glad that you have resolved the issue at hand.

We wanted to reproduce the behavior, so that we can investigate this more thoroughly. I created a small project but I was unable to get an exception. I am attaching the project. From your explanations I thought that pressing the first, then the second button, I would get the exception, but this does not happen. If it is convenient, can you please modify the project and send it to us, so that we can look into it and have a better idea where the issue originates. Thank you.

Regards,
Petar Marchev
Telerik
 

See What's Next in App Development. Register for TelerikNEXT.

 
0
Robert
Top achievements
Rank 1
answered on 27 Mar 2015, 10:19 AM
Hi,

I've modified the source to reproduce the crash, a few changes I've made......

- The Horizontal Axis is a linear axis in the xaml
- The crash happened when trying to remove data from the source collection, I've changed the behaviour of button2.

Here's the source for MainWindow.Xaml.cs. Apologies it won't let me attach zip files....
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Telerik.Windows.Controls.ChartView;
using System.Collections.ObjectModel;
using System.ComponentModel;
 
namespace wpf_ChartView_919422
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        ObservableCollection<PlotInfo> data;
 
        public MainWindow()
        {
            InitializeComponent();
 
            this.data = new ObservableCollection<PlotInfo>
            {
                new PlotInfo { XVal = 1, YVal = 12, },
                new PlotInfo { XVal = 2, YVal = 7, },
                new PlotInfo { XVal = 3, YVal = 8, },
                new PlotInfo { XVal = 4, YVal = 3, },
            };
 
            DrawSeries();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DrawSeries();
        }
 
        private void DrawSeries()
        {
            this.chart1.Series.Clear();
 
            ScatterLineSeries s = new ScatterLineSeries();
            s.XValueBinding = new PropertyNameDataPointBinding() { PropertyName = "XVal" };
            s.YValueBinding = new PropertyNameDataPointBinding() { PropertyName = "YVal" };
            s.ItemsSource = this.data;
            this.chart1.Series.Add(s);
        }
 
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            int indexToremove = this.data.Count - 1;
            this.data.Remove(this.data[indexToremove]);
        }
    }
 
    public class PlotInfo : INotifyPropertyChanged
    {
        private double xVal;
        private double yVal;
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        public double XVal
        {
            get
            {
                return this.xVal;
            }
            set
            {
                if (this.xVal != value)
                {
                    this.xVal = value;
                    this.RaisePropertyChanged("XCat");
                }
            }
        }
 
        public double YVal
        {
            get
            {
                return this.yVal;
            }
            set
            {
                if (this.yVal != value)
                {
                    this.yVal = value;
                    this.RaisePropertyChanged("YVal");
                }
            }
        }
 
        private void RaisePropertyChanged(string propertyName)
        {
            var h = this.PropertyChanged;
            if (h != null)
            {
                h(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

Now, to reproduce the crash

1) Click "Update Data" => Last point is removed from chart
2) Click "Change Series"
3) Click "Update Data" => The last point should be removed from the chart, but here it crashes.

Thanks,

Rob
0
Petar Marchev
Telerik team
answered on 27 Mar 2015, 02:15 PM
Hello Robert,

Thank you for the attention. I can now reproduce the exception. I have updated your Telerik points as a token of appreciation for taking out your time and helping us improve our products.

Regards,
Petar Marchev
Telerik
 

See What's Next in App Development. Register for TelerikNEXT.

 
Tags
ChartView
Asked by
Rob
Top achievements
Rank 1
Answers by
Petar Marchev
Telerik team
Robert
Top achievements
Rank 1
Share this question
or