Devexpress中chartcontrol控件报System.ArgumentOutOfRangeException:“指定的参数已超出有效值的范围。Arg_ParamNam异常及解决办法

描述:C# winform软件使用了chartcontrol控件,在使用Timer 动态为图表添加点时,报错(有时报错,有时不报错)

报错内容如下:

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)

解决办法:DevExpress 中ChartControl 在生成Chart 和动态更新Chart 时,只适用于同 一个主线程中.

将System.Timers.Timer 替换为 System.Windows.Forms.Timer 即可。

参考官方回答:ArgumentOutOfRangeException on chart repaint. | DevExpress SupportHi Support, I get an ArgumentOutOfRangeException for an invalid index when a chart repaints. The call stack follows bellow. I know it is prahttps://supportcenter.devexpress.com/ticket/details/t733964/argumentoutofrangeexception-on-chart-repaint

ArgumentOutOfRangeException on chart repaint. | DevExpress Support

官方技术支持建议 绑定数据和图形控件在同一线程。

解决:在订阅事件方法中调用this.BeginInvoke()方法,在委托内进行数据和图形处理。

引申:

1、System.Windows.Forms:

  System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器。Timer控件和它所在的Form属于同一个线程;


2、System.Timers.Timer:

  System.Timers命名空间下的Timer类。System.Timers.Timer类:定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时。AutoReset属性设置是否重复计时(设置为false只执行一次,设置为true可以多次执行)。Elapsed事件绑定相当于另开了一个线程,也就是说在Elapsed绑定的事件里不能访问其它线程里的控件(需要定义委托,通过Invoke调用委托访问其它线程里面的控件)。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值