C#实现chart控件动态曲线绘制

  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

  {

  }

  }

  }