c#实时更新图表

时间:2016-06-29 14:49:11

标签: c# events charts timer

这里我有一个图表(graph1),通常应该每1秒添加一个随机点。但它没有...我试图找出问题所在,但在这里我没有任何想法...... 计时器启动,label1每秒更改一次,但图表不会改变...当我点击它时按钮1会添加一个新点。  我错过了什么?请帮忙......非常感谢。

namespace Test_Chart1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
        graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true;
        graph1.ChartAreas[0].AxisX.ScaleView.Size = 40;
        System.Timers.Timer _Timer1s = new System.Timers.Timer(1000);   //object
        _Timer1s.Elapsed += _Timer1sElapsed;                            //event in object
        _Timer1s.Start();                                               //start counting            
    }
    private void _Timer1sElapsed(object sender, EventArgs e)//Timer each 100ms
    {        
        if (label1.BackColor == Color.Red)
        {
            label1.BackColor = Color.Blue;
            PutValueInGraph1();              
        }
        else label1.BackColor = Color.Red;             
    }

    private void button1_Click(object sender, EventArgs e)
    {
        PutValueInGraph1();
    }
    private void PutValueInGraph1()
    {
        graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
        graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true;
        graph1.ChartAreas[0].AxisX.ScaleView.Size = 100;
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        listBox1.Items.Add(ValueToAdd.ToString());
        graph1.Series["Data1"].Points.AddY(ValueToAdd);
        if (graph1.ChartAreas[0].AxisX.Maximum-10 > graph1.ChartAreas[0].AxisX.ScaleView.Size)
        {
               graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum);
            graph1.Series["Data1"].Points.RemoveAt(0);
        }
    }
}
}

好的,这是新的:

public partial class Form1 : Form
{
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();

    public Form1()
    {
        InitializeComponent();
        myTimer.Tick += new EventHandler(TimerEventProcessor);
        myTimer.Interval = 1;           
    }

    private void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
    {
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        listBox1.Items.Add(ValueToAdd.ToString());
        graph1.Series["Data1"].Points.AddY(ValueToAdd);
        if (graph1.ChartAreas[0].AxisX.Maximum - 10 > graph1.ChartAreas[0].AxisX.ScaleView.Size)
        {
            graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum);
            graph1.Series["Data1"].Points.RemoveAt(0);
        }
    }
    private void btn_Start_Click_1(object sender, EventArgs e)
    {
        graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
        graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true;
        graph1.ChartAreas[0].AxisX.ScaleView.Size = 100;
        myTimer.Start();
        BlinkLed.BackColor = Color.YellowGreen;
    } 
  private void btn_Stop_Click(object sender, EventArgs e)
    {
        myTimer.Stop();
        BlinkLed.BackColor = Color.AliceBlue;
    }   
}  

你认为它更好吗? 变化的线程怎么样?

如果我有一个按钮:

   private void PutValueInGraph1()
    {
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        listBox1.Items.Add(ValueToAdd.ToString());
        graph1.Series["Data1"].Points.AddY(ValueToAdd);
        if (graph1.ChartAreas[0].AxisX.Maximum-10 > graph1.ChartAreas[0].AxisX.ScaleView.Size)
        {
            graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum);
            graph1.Series["Data1"].Points.RemoveAt(0);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {//try to raise exception
        PutValueInGraph1();
    }

我改变了这样的事件:

   private void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
    {//try to raise exception
        PutValueInGraph1();
    }

当我启动计时器时,数据输入加速,我在按钮1上一直点击。

为什么没有例外,因为tom_imk说? 因为我们可以同时访问相同的功能....?

感谢您的回答。

2 个答案:

答案 0 :(得分:0)

我很惊讶你没有得到例外。你正在操纵UI线程之外的UI元素,这是你永远不会做的事情。

请参阅此问题的答案: How to update the GUI from another thread in C#?

编辑: 要弄清楚为什么timerelapsed方法不能在UI线程上运行:它只是这里使用的错误类。因此,简单的解决方案是不在Form-constructor中创建System.Timers.Timer,而是在表单设计器中删除表单上的计时器并使用它。 sowjanya attaluri的解决方案应该被标记为正确的答案。

答案 1 :(得分:0)

我尝试了以下示例代码,它对我来说很好。

    public Form7()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        chart1.ChartAreas[0].AxisX.Maximum = 100;
        chart1.ChartAreas[0].AxisX.Minimum = 0;
        chart1.ChartAreas[0].AxisX.Interval = 1;

        timer1.Start();           
    }

    private void timer1_Tick(object sender, EventArgs e)
    {  
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        chart1.Series[0].Points.AddY(ValueToAdd);
    }