C# - 实时更新图表

4
请耐心等待,我是新来的Stack Overflow助手,但在研究我不熟悉的编程方法时,我长期以来一直将其用作资源。
我阅读了一个C# Windows Forms应用程序中创建图形的教程,并试图找出如何使其实时更新,如果我需要使用图形来绘制传感器中的总数据量。为了测试它,我正在使用一个定时器,每秒钟(1000毫秒)滴答一次。在我使用这个传感器之前,我有两个值自动递增1。
我目前面临的问题是,图表本身不会更新,并且仅保持在加载表单时绘制的方式。我认为是因为我必须重新绘制图表才能更新chart1.Update();,我尝试在每秒钟重新创建图表之前/之后使用它。然而,结果无论如何都是相同的。我只是想知道是否有什么我没有做或需要更改,以便实时更新图表。

这是当前代码所在的位置:

public partial class Form1 : Form
{
    int a = 1;
    int b = 2;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Data arrays.
        string[] seriesArray = { "Cats", "Dogs" };
        int[] pointsArray = { a, b };

        // Set palette.
        this.chart1.Palette = ChartColorPalette.SeaGreen;

        // Set title.
        this.chart1.Titles.Add("Pets");

        // Add series.
        for (int i = 0; i < seriesArray.Length; i++)
        {
            // Add series.
            Series series = this.chart1.Series.Add(seriesArray[i]);

            // Add point.
            series.Points.Add(pointsArray[i]);
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        a++;
        b++;

        // Data arrays.
        string[] seriesArray = { "Cats", "Dogs" };
        int[] pointsArray = { a, b };

        // Set palette.
        this.chart1.Palette = ChartColorPalette.SeaGreen;

        // Set title.
        this.chart1.Titles.Add("Pets");

        // Add series.
        for (int i = 0; i < seriesArray.Length; i++)
        {
            // Add series.
            Series series = this.chart1.Series.Add(seriesArray[i]);

            // Add point.
            series.Points.Add(pointsArray[i]);
        }

        chart1.Update();
    }
}

请查看http://sourceforge.net/projects/zedgraph/。 - Paul Zahra
你试过使用.Refresh()而不是.Update()吗? - BCdotWEB
2
两者都不应该是必要的。计时器已经启动了吗?你是否触发了Tick事件? - TaW
1个回答

5

你的代码存在几个问题:

  • 计时器单击事件没有挂钩。我知道这不是因为否则你会收到一个告诉你的异常..
  • ..你只能添加一个系列一次。你在每个timer.Tick上都这样做。所有这些设置命令都应该放在一个初始方法中,例如表单加载。

我已经纠正了以下代码中的错误,但显然数据还没有任何意义。 另外:虽然我已经添加了代码来连接timer.Tick,但button.Click没有连接。通常你可以通过双击控件来连接设计器,以连接控件的标准事件,或者通过在属性页面中的控件事件选项卡中双击事件来连接事件。

int a = 1;
int b = 2;
string[] seriesArray = { "Cats", "Dogs" };

private void Form1_Load(object sender, EventArgs e)
{
    // Set palette.
    this.chart1.Palette = ChartColorPalette.SeaGreen;

    // Set title.
    this.chart1.Titles.Add("Pets");

    // Add series
    this.chart1.Series.Clear();
    for (int i = 0; i < seriesArray.Length; i++)
    {
        chart1.Series.Add(seriesArray[i]);
    }
    // hook up timer event
    timer1.Tick += timer1_Tick;
}




private void timer1_Tick(object sender, EventArgs e)
{
    a++;
    b++;

    // Data array
    int[] pointsArray = { a, b };

    for (int i = 0; i < seriesArray.Length; i++)
    {
        // Add point.
        chart1.Series[i].Points.Add(pointsArray[i]);
    }

}

private void button1_Click(object sender, EventArgs e)
{
    timer1.Start();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接