我有一个用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);
}
}
}
}
不好意思是一个完全的菜鸟,但我不知道,这次我做错了什么。
答案 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);
}
}