C#每隔几秒刷新一次图表

时间:2014-05-23 20:22:36

标签: c# charts

我有一个用C#编写的Windows窗体应用程序。这个想法是,它在点击按钮后绘制了10个数字的图表。这很好用。我点击按钮,我得到一个漂亮的图表。但是我还希望包含一种“自动刷新”模式,其中图表每隔几秒刷新一次。这将通过Checkbox启用。这是我的代码:

private void chartButton_Click(object sender, EventArgs e) //draw a chart after the button is clicked
{
   Random rdn1 = new Random();
   int value;

   foreach (var series in ekran.Series) //clear previous values
   {
      series.Points.Clear();
   }

   for (int i = 0; i < 10; i++) //draw a chart from ten new values
   {
      value = rdn1.Next(0, 10); //for testing purpouses the value will be a random number a random number
      ekran.Series["seria1"].Points.AddXY(i, value);
   }
}

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{
   while(checkBox1.Checked) //click the chartButton every one second, when the checkbox is checked
   {
      //rysuj.PerformClick(); 
      chartButton.PerformClick();
      Thread.Sleep(1000);
   }
}   

现在我的问题。当我检查Checkbox时,在完成while循环的每次迭代之前,我都不会得到图表。由于它是一个无限循环,我永远不会得到我的图表。如果我在检查Checkbox时重写代码只进行五次迭代,我只得到第五次的图表(并且在五秒之后,如预期的那样)。

所以我的问题是:每次通过chartButton.PerformClick()点击按钮时,如何强制此绘制图表?当我手动点击按钮时,一切正常,就在我尝试自动完成时,我遇到了问题。

EDIT 首先,感谢您的回复。但是,使用计时器时我仍然遇到同样的问题。这就是我的代码现在的样子:

namespace ChartTest
{
public partial class Form1 : Form
{

    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();


    public Form1()
    {
        InitializeComponent();
        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = 1000;
    }

    void timer_Tick(object sender, EventArgs e)
    {
        timer.Enabled = false;
        chartButton.PerformClick();

    }        

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {

        while (checkBox1.Checked)            
        {
            timer.Enabled = true;                       // Enable the timer
            timer.Start();                              // Start the timer
        }

    }

    private void chartButton_Click(object sender, EventArgs e)      //draw a chart after the button is clicked
    {
        Random rdn1 = new Random();
        int value;

        ekran.Series.Clear();

        var series2 = new System.Windows.Forms.DataVisualization.Charting.Series
        {
            Name = "Series2",
            Color = System.Drawing.Color.Green,
            IsVisibleInLegend = false,
            IsXValueIndexed = true,
            ChartType = SeriesChartType.Line
        };
        this.ekran.Series.Add(series2);

        for (int i = 0; i < 100; i++)
        {
            value = rdn1.Next(0, 10);
            series2.Points.AddXY(i, value);
        }

    }

}
}

不好意思是一个完全的菜鸟,但我不知道,这次我做错了什么。

2 个答案:

答案 0 :(得分:1)

这正是Timer的用途。让复选框启动/停止或启用/禁用计时器,并处理Timer.Tick事件以重绘图表。在您的情况下,事件处理程序可以简单地调用chartButton.PerformClick(),或插入PerformClick()所做的任何代码。

ETA:如果图表刷新不是即时的,您可能希望将其推送到单独的线程。如果它是即时的,那么实际上并不需要处理线程。

答案 1 :(得分:0)

我会选择使用复选框的checkChange()事件组合的线程。从本质上讲,这将允许您的应用程序继续运行,而更新代码将定期执行。刷新由睡眠时间决定,而不是手动点击或任何其他值。下面的示例如何执行此操作:

Thread refreshThread = null;

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
   if (refreshThread == null) //No thread running, assume it starts this way
   {
      refreshThread = new Thread(chartRefresh);
      refreshThread.Start();
   }
   else //Thread is running, must terminate
   {
      refreshThread.Abort();
      refreshThread = null;
   }
}

private void chartRefresh()
{
   while (true)
   {
      //code to refresh chart
      Thread.Sleep(10000);
   }
}