C#如何实现chart控件动态曲线绘制
这篇文章将为大家详细讲解有关C#如何实现chart控件动态曲线绘制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
具体内容如下
思想实验室要做一个动态曲线绘制,网上方法很多,但是缺乏完整代码和效果图的整合,往往总是缺少其一,因此整理如下,方便大家编程,节约时间。
思路:新建一个队列,利用timer控件,动态的往队列中加入数据,每次触发事件,就相当于将队列中的值全部重新画一遍。
我的目的是做四个点的动态监测,所以代码重复了四次,其实应该用4个线程来做,思路就显得较为清晰了,这也是可以改进的地方。
publicpartialclass界面_Xtratabcontrol版本_:Form{privateQueue<double>dataQueue1=newQueue<double>(100);//30个就清空一次privateQueue<double>dataQueue2=newQueue<double>(100);//30个就清空一次privateQueue<double>dataQueue3=newQueue<double>(100);//30个就清空一次privateQueue<double>dataQueue4=newQueue<double>(100);//30个就清空一次privateintstress1=0;//设置一个压力值全局变量privateintstress2=0;//设置一个压力值全局变量privateintstress3=0;//设置一个压力值全局变量privateintstress4=0;//设置一个压力值全局变量stringmonthNow="";stringmonthNext="";stringcurrentTime="";boolisRefresh=false;public界面_Xtratabcontrol版本_(){InitializeComponent();dataGridView1.AutoGenerateColumns=false;//设置不自动显示数据库中未绑定的列//设置隔行背景色this.dataGridView1.RowsDefaultCellStyle.BackColor=Color.Bisque;this.dataGridView1.AlternatingRowsDefaultCellStyle.BackColor=Color.Beige;}privatevoidbtnInit_Click(objectsender,EventArgse){InitChart1();InitChart2();InitChart3();InitChart4();}privatevoidbtnStart_Click(objectsender,EventArgse){this.timer1.Start();}privatevoidbtnStop_Click(objectsender,EventArgse){this.timer1.Stop();}privatevoidtimer1_Tick(objectsender,EventArgse){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(inti=0;i<dataQueue1.Count;i++){this.chart1.Series[0].Points.AddXY((i+1),dataQueue1.ElementAt(i));相当于每次都是重新画一遍}for(inti=0;i<dataQueue2.Count;i++){this.chart2.Series[0].Points.AddXY((i+1),dataQueue2.ElementAt(i));相当于每次都是重新画一遍}for(inti=0;i<dataQueue3.Count;i++){this.chart3.Series[0].Points.AddXY((i+1),dataQueue3.ElementAt(i));相当于每次都是重新画一遍}for(inti=0;i<dataQueue4.Count;i++){this.chart4.Series[0].Points.AddXY((i+1),dataQueue4.ElementAt(i));相当于每次都是重新画一遍}}catch(Exceptionex){MessageBox.Show(ex.Message);}}privatevoidInitChart1(){try{//定义图表区域this.chart1.ChartAreas.Clear();ChartAreachartArea1=newChartArea("C1");this.chart1.ChartAreas.Add(chartArea1);//this.chart1.Dock=DockStyle.Fill;//定义存储和显示点的容器this.chart1.Series.Clear();Seriesseries1=newSeries("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=newSystem.Drawing.Font("MicrosoftSansSerif",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(Exceptionex){}}privatevoidInitChart2(){try{//定义图表区域this.chart2.ChartAreas.Clear();ChartAreachartArea2=newChartArea("C2");this.chart2.ChartAreas.Add(chartArea2);//this.chart1.Dock=DockStyle.Fill;//定义存储和显示点的容器this.chart2.Series.Clear();Seriesseries2=newSeries("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=newSystem.Drawing.Font("MicrosoftSansSerif",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(Exceptionex){}}privatevoidInitChart3(){try{//定义图表区域this.chart3.ChartAreas.Clear();ChartAreachartArea3=newChartArea("C3");this.chart3.ChartAreas.Add(chartArea3);//this.chart1.Dock=DockStyle.Fill;//定义存储和显示点的容器this.chart3.Series.Clear();Seriesseries3=newSeries("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=newSystem.Drawing.Font("MicrosoftSansSerif",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(Exceptionex){}}privatevoidInitChart4(){try{//定义图表区域this.chart4.ChartAreas.Clear();ChartAreachartArea4=newChartArea("C4");this.chart4.ChartAreas.Add(chartArea4);//this.chart1.Dock=DockStyle.Fill;//定义存储和显示点的容器this.chart4.Series.Clear();Seriesseries4=newSeries("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=newSystem.Drawing.Font("MicrosoftSansSerif",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(Exceptionex){}}privatevoidUpdateDate(){//1234号点同时更新try{//获取当前时间的batch值,将batch+1的时间值提取显示。stringselectsql=string.Format("select*fromstressinfowhereoperatetime=to_date('{0}','yyyy-mm-dd')",dtp1.Value.ToShortDateString());DataTabledtDate=newDataTable();dtDate=DBEngine.GetDataTableBySql(selectsql);if(dtDate.Rows.Count>0)//4条{string[]getmonthNow=dtp1.Value.ToShortDateString().Split('/');//有的电脑是'-'monthNow=getmonthNow[1];intcurrentBatch=DBEngine.ObjToInt(dtDate.Rows[0]["batchnum"]);//intcurrentNode=DBEngine.ObjToInt(dtDate.Rows[0]["NODE"]);//当前节点和当前批次确定唯一记录currentBatch++;//获取下一个显示的时间值以及应力值stringnextsql1=string.Format("select*fromstressinfowherebatchnum='{0}'andnode=1",currentBatch);DataTabledtNext1=newDataTable();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();//停止键焦点显示}///第二个点,不用更新数据stringnextsql2=string.Format("select*fromstressinfowherebatchnum='{0}'andnode=2",currentBatch);DataTabledtNext2=newDataTable();dtNext2=DBEngine.GetDataTableBySql(nextsql2);//取得了下一个批次的所有应力监测点数据。if(dtNext2.Rows.Count>0){stress2=DBEngine.ObjToInt(dtNext2.Rows[0]["CURRENTSTRESS"]);}else{timer1.Stop();//数据到头了,没有数据了,batch+1找不到了btnStop.Focus();//停止键焦点显示}///第三个点,不用更新数据stringnextsql3=string.Format("select*fromstressinfowherebatchnum='{0}'andnode=3",currentBatch);DataTabledtNext3=newDataTable();dtNext3=DBEngine.GetDataTableBySql(nextsql3);//取得了下一个批次的所有应力监测点数据。if(dtNext3.Rows.Count>0){stress3=DBEngine.ObjToInt(dtNext3.Rows[0]["CURRENTSTRESS"]);}else{timer1.Stop();//数据到头了,没有数据了,batch+1找不到了btnStop.Focus();//停止键焦点显示}///第四个点,不用更新数据stringnextsql4=string.Format("select*fromstressinfowherebatchnum='{0}'andnode=4",currentBatch);DataTabledtNext4=newDataTable();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控件动态曲线绘制”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。