C#如何实现chart控件动态曲线绘制
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章将为大家详细讲解有关C#如何实现chart控件动态曲线绘制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下思想实验室要做一个动态曲线绘制,网上方法
千家信息网最后更新 2025年11月16日C#如何实现chart控件动态曲线绘制
这篇文章将为大家详细讲解有关C#如何实现chart控件动态曲线绘制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
具体内容如下
思想
实验室要做一个动态曲线绘制,网上方法很多,但是缺乏完整代码和效果图的整合,往往总是缺少其一,因此整理如下,方便大家编程,节约时间。
思路:新建一个队列,利用timer控件,动态的往队列中加入数据,每次触发事件,就相当于将队列中的值全部重新画一遍。
我的目的是做四个点的动态监测,所以代码重复了四次,其实应该用4个线程来做,思路就显得较为清晰了,这也是可以改进的地方。
public partial class 界面_Xtratabcontrol版本_ : Form { private Queue dataQueue1 = new Queue(100); //30个就清空一次 private Queue dataQueue2 = new Queue(100); //30个就清空一次 private Queue dataQueue3 = new Queue(100); //30个就清空一次 private Queue dataQueue4 = new Queue(100); //30个就清空一次 private int stress1 = 0;//设置一个压力值全局变量 private int stress2 = 0;//设置一个压力值全局变量 private int stress3 = 0;//设置一个压力值全局变量 private int stress4 = 0;//设置一个压力值全局变量 string monthNow = ""; string monthNext = ""; string currentTime = ""; bool isRefresh = false; public 界面_Xtratabcontrol版本_() { InitializeComponent(); dataGridView1.AutoGenerateColumns = false; //设置不自动显示数据库中未绑定的列 //设置隔行背景色 this.dataGridView1.RowsDefaultCellStyle.BackColor = Color.Bisque; this.dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Beige; } private void btnInit_Click(object sender, EventArgs e) { InitChart1(); InitChart2(); InitChart3(); InitChart4(); } private void btnStart_Click(object sender, EventArgs e) { this.timer1.Start(); } private void btnStop_Click(object sender, EventArgs e) { this.timer1.Stop(); } private void timer1_Tick(object sender, EventArgs e) { try { UpdateDate(); //根据当前时间取下一个数据,同时给month赋值 dataQueue1.Enqueue(stress1); //就是这,不断往里面加数据。 dataQueue2.Enqueue(stress2); dataQueue3.Enqueue(stress3); dataQueue4.Enqueue(stress4); if (isRefresh) { //刷新界面 isRefresh = false; InitChart1(); InitChart2(); InitChart3(); InitChart4(); dataQueue1.Enqueue(stress1); dataQueue2.Enqueue(stress2); dataQueue3.Enqueue(stress3); dataQueue4.Enqueue(stress4); } this.chart1.Series[0].Points.Clear(); this.chart2.Series[0].Points.Clear(); this.chart3.Series[0].Points.Clear(); this.chart4.Series[0].Points.Clear(); for (int i = 0; i < dataQueue1.Count; i++) { this.chart1.Series[0].Points.AddXY((i + 1), dataQueue1.ElementAt(i)); 相当于每次都是重新画一遍 } for (int i = 0; i < dataQueue2.Count; i++) { this.chart2.Series[0].Points.AddXY((i + 1), dataQueue2.ElementAt(i)); 相当于每次都是重新画一遍 } for (int i = 0; i < dataQueue3.Count; i++) { this.chart3.Series[0].Points.AddXY((i + 1), dataQueue3.ElementAt(i)); 相当于每次都是重新画一遍 } for (int i = 0; i < dataQueue4.Count; i++) { this.chart4.Series[0].Points.AddXY((i + 1), dataQueue4.ElementAt(i)); 相当于每次都是重新画一遍 } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void InitChart1() { try { //定义图表区域 this.chart1.ChartAreas.Clear(); ChartArea chartArea1 = new ChartArea("C1"); this.chart1.ChartAreas.Add(chartArea1); //this.chart1.Dock = DockStyle.Fill; //定义存储和显示点的容器 this.chart1.Series.Clear(); Series series1 = new Series("S1"); series1.ChartArea = "C1"; this.chart1.Series.Add(series1); //设置图表显示样式 this.chart1.ChartAreas[0].AxisY.Minimum = 30000; this.chart1.ChartAreas[0].AxisY.Maximum = 50000; this.chart1.ChartAreas[0].AxisX.Minimum = 1; this.chart1.ChartAreas[0].AxisX.Maximum = 31; this.chart1.ChartAreas[0].AxisX.Interval = 1; this.chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver; this.chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver; //设置标题 this.chart1.Titles.Clear(); this.chart1.Titles.Add("S01"); this.chart1.Titles[0].Text = "1号监测点"; this.chart1.Titles[0].ForeColor = Color.RoyalBlue; this.chart1.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); //设置图表显示样式 this.chart1.Series[0].Color = Color.Red; if (rb1.Checked) { //this.chart1.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart1.Titles[0].Text = string.Format("1号监测点"); this.chart1.Series[0].ChartType = SeriesChartType.Line; } if (rb2.Checked) { this.chart1.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart1.Series[0].ChartType = SeriesChartType.Spline; } this.chart1.Series[0].Points.Clear(); //DBEngine.ConnectDB("orcl", "dt", "6312"); dataQueue1.Clear();//清空队列中所有数据 } catch (Exception ex) { } } private void InitChart2() { try { //定义图表区域 this.chart2.ChartAreas.Clear(); ChartArea chartArea2 = new ChartArea("C2"); this.chart2.ChartAreas.Add(chartArea2); //this.chart1.Dock = DockStyle.Fill; //定义存储和显示点的容器 this.chart2.Series.Clear(); Series series2 = new Series("S2"); series2.ChartArea = "C2"; this.chart2.Series.Add(series2); //设置图表显示样式 this.chart2.ChartAreas[0].AxisY.Minimum = 30000; this.chart2.ChartAreas[0].AxisY.Maximum = 50000; this.chart2.ChartAreas[0].AxisX.Minimum = 1; this.chart2.ChartAreas[0].AxisX.Maximum = 31; this.chart2.ChartAreas[0].AxisX.Interval = 1; this.chart2.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver; this.chart2.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver; //设置标题 this.chart2.Titles.Clear(); this.chart2.Titles.Add("S02"); this.chart2.Titles[0].Text = "动态折线图显示"; this.chart2.Titles[0].ForeColor = Color.RoyalBlue; this.chart2.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); //标题字体 //设置图表显示样式 this.chart2.Series[0].Color = Color.Red; if (rb1.Checked) { //this.chart2.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart2.Titles[0].Text = string.Format("2号监测点"); this.chart2.Series[0].ChartType = SeriesChartType.Line; } if (rb2.Checked) { this.chart2.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart2.Series[0].ChartType = SeriesChartType.Spline; } this.chart2.Series[0].Points.Clear(); //DBEngine.ConnectDB("orcl", "dt", "6312"); dataQueue2.Clear();//清空队列中所有数据 } catch (Exception ex) { } } private void InitChart3() { try { //定义图表区域 this.chart3.ChartAreas.Clear(); ChartArea chartArea3 = new ChartArea("C3"); this.chart3.ChartAreas.Add(chartArea3); //this.chart1.Dock = DockStyle.Fill; //定义存储和显示点的容器 this.chart3.Series.Clear(); Series series3 = new Series("S3"); series3.ChartArea = "C3"; this.chart3.Series.Add(series3); //设置图表显示样式 this.chart3.ChartAreas[0].AxisY.Minimum = 30000; this.chart3.ChartAreas[0].AxisY.Maximum = 50000; this.chart3.ChartAreas[0].AxisX.Minimum = 1; this.chart3.ChartAreas[0].AxisX.Maximum = 31; this.chart3.ChartAreas[0].AxisX.Interval = 1; this.chart3.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver; this.chart3.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver; //设置标题 this.chart3.Titles.Clear(); this.chart3.Titles.Add("S03"); this.chart3.Titles[0].Text = "动态折线图显示"; this.chart3.Titles[0].ForeColor = Color.RoyalBlue; this.chart3.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); //标题字体 //设置图表显示样式 this.chart3.Series[0].Color = Color.Red; if (rb1.Checked) { //this.chart3.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart3.Titles[0].Text = string.Format("3号监测点"); this.chart3.Series[0].ChartType = SeriesChartType.Line; } if (rb2.Checked) { this.chart3.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart3.Series[0].ChartType = SeriesChartType.Spline; } this.chart3.Series[0].Points.Clear(); //DBEngine.ConnectDB("orcl", "dt", "6312"); dataQueue3.Clear();//清空队列中所有数据 } catch (Exception ex) { } } private void InitChart4() { try { //定义图表区域 this.chart4.ChartAreas.Clear(); ChartArea chartArea4 = new ChartArea("C4"); this.chart4.ChartAreas.Add(chartArea4); //this.chart1.Dock = DockStyle.Fill; //定义存储和显示点的容器 this.chart4.Series.Clear(); Series series4 = new Series("S4"); series4.ChartArea = "C4"; this.chart4.Series.Add(series4); //设置图表显示样式 this.chart4.ChartAreas[0].AxisY.Minimum = 30000; this.chart4.ChartAreas[0].AxisY.Maximum = 50000; this.chart4.ChartAreas[0].AxisX.Minimum = 1; this.chart4.ChartAreas[0].AxisX.Maximum = 31; this.chart4.ChartAreas[0].AxisX.Interval = 1; this.chart4.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver; this.chart4.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver; //设置标题 this.chart4.Titles.Clear(); this.chart4.Titles.Add("S04"); this.chart4.Titles[0].Text = "动态折线图显示"; this.chart4.Titles[0].ForeColor = Color.RoyalBlue; this.chart4.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); //标题字体 //设置图表显示样式 this.chart4.Series[0].Color = Color.Red; if (rb1.Checked) { //this.chart4.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart4.Titles[0].Text = string.Format("4号监测点"); this.chart4.Series[0].ChartType = SeriesChartType.Line; } if (rb2.Checked) { this.chart4.Titles[0].Text = string.Format("动态 {0} 显示", rb1.Text); this.chart4.Series[0].ChartType = SeriesChartType.Spline; } this.chart4.Series[0].Points.Clear(); //DBEngine.ConnectDB("orcl", "dt", "6312"); dataQueue4.Clear();//清空队列中所有数据 } catch (Exception ex) { } } private void UpdateDate() { //1 2 3 4号点同时更新 try { //获取当前时间的batch值,将batch+1的时间值提取显示。 string selectsql = string.Format("select * from stressinfo where operatetime=to_date('{0}','yyyy-mm-dd')", dtp1.Value.ToShortDateString()); DataTable dtDate = new DataTable(); dtDate = DBEngine.GetDataTableBySql(selectsql); if (dtDate.Rows.Count > 0) //4条 { string[] getmonthNow = dtp1.Value.ToShortDateString().Split('/'); //有的电脑是'-' monthNow = getmonthNow[1]; int currentBatch = DBEngine.ObjToInt(dtDate.Rows[0]["batchnum"]); //int currentNode = DBEngine.ObjToInt(dtDate.Rows[0]["NODE"]); //当前节点和当前批次确定唯一记录 currentBatch++; //获取下一个显示的时间值以及应力值 string nextsql1 = string.Format("select * from stressinfo where batchnum='{0}' and node=1", currentBatch); DataTable dtNext1 = new DataTable(); dtNext1 = DBEngine.GetDataTableBySql(nextsql1);//取得了下一个批次的所有应力监测点数据。 if (dtNext1.Rows.Count > 0) { stress1 = DBEngine.ObjToInt(dtNext1.Rows[0]["CURRENTSTRESS"]); dtp1.Value = DBEngine.ObjToDateTime(dtNext1.Rows[0]["OPERATETIME"]); //日期显示(之后应该还有各点应力的提取) currentTime = dtp1.Value.ToShortDateString(); string[] datetime = currentTime.Split('/'); monthNext = datetime[1]; if (monthNow != monthNext) isRefresh = true; } else { timer1.Stop();//数据到头了,没有数据了,batch+1找不到了 btnStop.Focus(); //停止键焦点显示 } ///第二个点,不用更新数据 string nextsql2 = string.Format("select * from stressinfo where batchnum='{0}' and node=2", currentBatch); DataTable dtNext2 = new DataTable(); dtNext2 = DBEngine.GetDataTableBySql(nextsql2);//取得了下一个批次的所有应力监测点数据。 if (dtNext2.Rows.Count > 0) { stress2 = DBEngine.ObjToInt(dtNext2.Rows[0]["CURRENTSTRESS"]); } else { timer1.Stop();//数据到头了,没有数据了,batch+1找不到了 btnStop.Focus(); //停止键焦点显示 } ///第三个点,不用更新数据 string nextsql3 = string.Format("select * from stressinfo where batchnum='{0}' and node=3", currentBatch); DataTable dtNext3 = new DataTable(); dtNext3 = DBEngine.GetDataTableBySql(nextsql3);//取得了下一个批次的所有应力监测点数据。 if (dtNext3.Rows.Count > 0) { stress3 = DBEngine.ObjToInt(dtNext3.Rows[0]["CURRENTSTRESS"]); } else { timer1.Stop();//数据到头了,没有数据了,batch+1找不到了 btnStop.Focus(); //停止键焦点显示 } ///第四个点,不用更新数据 string nextsql4 = string.Format("select * from stressinfo where batchnum='{0}' and node=4", currentBatch); DataTable dtNext4 = new DataTable(); dtNext4 = DBEngine.GetDataTableBySql(nextsql4);//取得了下一个批次的所有应力监测点数据。 if (dtNext4.Rows.Count > 0) { stress4 = DBEngine.ObjToInt(dtNext4.Rows[0]["CURRENTSTRESS"]); } else { timer1.Stop();//数据到头了,没有数据了,batch+1找不到了 btnStop.Focus(); //停止键焦点显示 } } } catch { } }} 因为涉及到一些业务,有些代码没有粘,数据是和Oracle数据库进行交互的,类文件名DBEngine.cs,大家自己做的时候别忘连接数据库,最终效果图
关于"C#如何实现chart控件动态曲线绘制"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
数据
应力
动态
批次
监测
全局
压力
变量
得了
焦点
监测点
控件
曲线
不用
代码
数据库
时间
界面
篇文章
队列
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器更换ip
2020吉林省网络安全会议
数据库的增删
网信网络安全责任制落实情况
数据库连接到u盘
mdb是什么数据库
6月1日网络安全法信息
数据库的完整性包括
深度社神经网络技术的应用
天勤网络安全
大专计算机网络技术毕业鉴定
内网服务器管理内部网络
杨浦区通信网络技术铸造辉煌
新客网络技术有限公司怎么样
鸽子我的世界在服务器里坑人
自动变速器软件开发需要专业
机架式服务器更换内存
北辰区网络安全
刀片服务器的优缺点
网络安全软件分析
java网上数据库
600人的企业需要建数据库吗
外墙砖效果图软件开发
介绍数据库分析
用手机管理小米云服务器
泉州工商分行有软件开发吗
怎么看当前数据库名
网络安全去哪了解
服务器每秒计算能力
常德市网络安全知识