<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C#實現chart控制元件動態曲線繪製的具體程式碼,供大家參考,具體內容如下
實驗室要做一個動態曲線繪製,網上方法很多,但是缺乏完整程式碼和效果圖的整合,往往總是缺少其一,因此整理如下,方便大家程式設計,節約時間。
思路:新建一個佇列,利用timer控制元件,動態的往佇列中加入資料,每次觸發事件,就相當於將佇列中的值全部重新畫一遍。
我的目的是做四個點的動態監測,所以程式碼重複了四次,其實應該用4個執行緒來做,思路就顯得較為清晰了,這也是可以改進的地方。
public partial class 介面_Xtratabcontrol版本_ : Form { private Queue<double> dataQueue1 = new Queue<double>(100); //30個就清空一次 private Queue<double> dataQueue2 = new Queue<double>(100); //30個就清空一次 private Queue<double> dataQueue3 = new Queue<double>(100); //30個就清空一次 private Queue<double> dataQueue4 = new Queue<double>(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,大家自己做的時候別忘連線資料庫,最終效果圖
這個圖還有優化的控制元件,我後期要做一下,還是不太好看。
可以實現曲線隨日期動態增加,想到了就不難,我覺得思路挺好的,就記錄一下。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45