使用Devexpress的chartcontrol控件报System.ArgumentOutOfRangeException异常及解决办法
描述:C# winform软件使用了chartcontrol控件,在使用数据刷新时会不定时的报错(有时报错,有时不报错)
控件使用方法:charcontrol控件通过订阅事件获取最新的数据,然后在chartcontrol控件上显示。
报错内容如下:
System.ArgumentOutOfRangeException:“指定的参数已超出有效值的范围。
Arg_ParamName_Name”
System.ArgumentOutOfRangeException
HResult=0x80131502
Message=指定的参数已超出有效值的范围。
Arg_ParamName_Name
Source=DevExpress.Charts.v18.1.Core
StackTrace:
在 DevExpress.Charts.Native.RefinedPointCollection.InsertRange(Int32 index, ICollection`1 collection)
在 DevExpress.Charts.Native.CollectionManager.InsertSeriesPoints(IPointProcessor processor, Int32 insertIndex, ICollection`1 insertPoints)
在 DevExpress.Charts.Native.CollectionManager.UpdateCollections(IPointProcessor processor, SeriesPointsCollectionAction updateAction)
在 DevExpress.Charts.Native.PointsProcessor.UpdatePoints(SeriesPointsCollectionAction updateAction)
在 DevExpress.Charts.Native.SeriesController.ContextCalculator.ActionsExecutor.UpdateSeriesPointsCollection(SeriesPointsCollectionActionBase update)
在 DevExpress.Charts.Native.SeriesController.ContextCalculator.ActionsExecutor.Execute()
在 DevExpress.Charts.Native.SeriesController.ContextCalculator.CalculateContext(ChartUpdateAggregator updateAggregator)
在 DevExpress.Charts.Native.SeriesController.UpdatesExecutor.Execute(ChartUpdateAggregator updateAggregator)
在 DevExpress.Charts.Native.SeriesController.CommitTransaction(Boolean loading)
在 DevExpress.XtraCharts.Native.ViewController.ApplyChangesCore()
在 DevExpress.XtraCharts.Native.ViewController.ApplyChanges()
在 DevExpress.XtraCharts.Native.ViewController.ApplyChangesBeforeRender()
在 DevExpress.XtraCharts.Native.Chart.DrawContent(Graphics graphics, INativeGraphics nativeGraphics, Rectangle bounds, Rectangle windowsBounds, Boolean lockDrawingHelper, Boolean useImageCache, GraphicsQuality graphicsQuality)
在 DevExpress.XtraCharts.Native.Chart.DrawContent(Graphics graphics, Rectangle bounds, Boolean useImageCache)
在 DevExpress.XtraCharts.ChartControl.OnPaint(PaintEventArgs e)
在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
在 System.Windows.Forms.Control.WmPaint(Message& m)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 DevExpress.XtraCharts.ChartControl.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
解决办法:
参考官方回答:https://supportcenter.devexpress.com/ticket/details/t733964/argumentoutofrangeexception-on-chart-repaint
官方技术支持建议绑定数据和图形控件在同一线程。
解决:在订阅事件方法中调用this.BeginInvoke()方法,在委托内进行数据和图形处理。