C# Chart动态折线图,委托事件添加点导致的异常

暗夜流岚 2019-07-11 10:49:53
求助大神:我在做一个用Chart做动态折线图的时候采用委托事件,每接收一个点触发一次委托,在控件处画一个点,在测试过程中画面变成红叉,不定时报异常数字不能为负数,或者空指针异常,我在debug下测试看到是有数据的,代码:
  
/*画图委托*/
public delegate void DrawingChart(List<int> point);


//模拟数据接收 类RevDetectionSoket
public event Global.DrawingChart drawingChart; //画图委托事件
public void testDrawing() //模拟接收数据触发事件
{
Random r = new Random();
while (true)
{
lock (loker)
{
int point = r.Next(90, 100);
drawingChart (new List<int>{ i++, point }); //触发画图事件(绘制一个点i为x,point为y)
Thread.Sleep(20);
}

}
}



//显示数据类型
public ChartSimple(RevDetectionSoket revDetectionSoket)
{
InitializeComponent();
this.revDetectionSoket = revDetectionSoket;
revDetectionSoket.drawingChart += DrawingChart; //关联事件
}

private void DrawingChart(List<int> point)
{
chart1.Series[0].Points.AddXY(point[0],point[1]); //添加一个点
}



异常画面:
异常信息:
两种异常不一定同时发生;

PS:如果我实例化了多个ChartSimple对象,多个显示图表 对于委托事件有什么影响
...全文
491 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
暗夜流岚 2019-07-12
  • 打赏
  • 举报
回复
引用 9 楼 XBodhi. 的回复:
public class PictureBoxEx : PictureBox { protected override void OnPaint(PaintEventArgs pe) { try { base.OnPaint(pe); } catch { } } } 就这个。昨天用手机回的不方便打代码,你是这么弄的吗,
在论坛上上找到了写的方法https://blog.csdn.net/daming_ocean/article/details/3378239,谢谢我先试试
XBodhi. 2019-07-12
  • 打赏
  • 举报
回复
public class PictureBoxEx : PictureBox
{
protected override void OnPaint(PaintEventArgs pe)
{
try
{
base.OnPaint(pe);
}
catch { }
}
}

就这个。昨天用手机回的不方便打代码,你是这么弄的吗,
XBodhi. 2019-07-11
  • 打赏
  • 举报
回复
重写 onpaint 时间,内部异常处理掉即可,是因为渲染的时候出的问题,推荐用 WPF 。
暗夜流岚 2019-07-11
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
你可以在AddXY的地方添加一个条件断点,条件是 point[0]<0 || point[1]<0 看看问题到底出在哪
我用的debug调试,遇到值不能为负数的异常时,断点停在那里,我看了一下两个都是有值的;
stherix 2019-07-11
  • 打赏
  • 举报
回复
你可以在AddXY的地方添加一个条件断点,条件是 point[0]<0 || point[1]<0 看看问题到底出在哪
XBodhi. 2019-07-11
  • 打赏
  • 举报
回复
参考这个。 我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《winform chart实时绘图时出现空白和红叉》, 一起来围观吧 https://bbs.csdn.net/topics/392758614
XBodhi. 2019-07-11
  • 打赏
  • 举报
回复
在重写里面加个try 里面在调用父类的原方法
暗夜流岚 2019-07-11
  • 打赏
  • 举报
回复

引用 5 楼 XBodhi. 的回复:
在 base. 加异常捕获

额,后面知道,但是base那里能不能详细说一下,在下比较小白
XBodhi. 2019-07-11
  • 打赏
  • 举报
回复
在 base. 加异常捕获
暗夜流岚 2019-07-11
  • 打赏
  • 举报
回复
引用 3 楼 XBodhi. 的回复:
重写 onpaint 时间,内部异常处理掉即可,是因为渲染的时候出的问题,推荐用 WPF 。


是需要重写一个控件继承Chart类然后重写Onpaint方法么;
我这里查看chart元数据类只有接口
//
// 摘要:
// 重写 System.Windows.Forms.Control.OnPaint(System.Windows.Forms.PaintEventArgs)
// 方法。
//
// 参数:
// e:
// 包含事件参数的 System.PaintEventArgs 对象。
protected override void OnPaint(PaintEventArgs e);
具体怎么实现的看到不到,没办法重写啊

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧