我正在尝试为标签做“运行窗口”。我试图在谷歌找到类似的解决方案,但它让我无处可去。
示例:需要以不同的计数器值显示5个数字。这是我的timer_Start()的宏,因此,计数器每5秒增加一次,这是我的主窗体设置的。
显示:21 23 24 25 26
如果我插入另一个值,例如。 23,应显示最后5个数字。
显示:23 21 23 24 25,
但是,对于我下面的代码,当我插入另一个值时,它们中的所有5个都会改变。如果我更改为if(counter == 2)
,则在计数器== 3时无法获得更新。
int counter = 0;
sql_cmd = sql_conn.CreateCommand();
sql_cmd.CommandText = "SELECT * FROM temp where id=12";
try
{
sql_conn.Open();
sql_reader = sql_cmd.ExecuteReader();
while (sql_reader.Read()) // start retrieve
{
if (counter >= 1)
{
this.avg1.Text = sql_reader["Temp1"].ToString();
}
}
sql_conn.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
if (counter >= 2)
{
avg2.Text = avg1.Text;
}
if (counter >= 3)
{
avg3.Text = avg2.Text;
}
if (counter >= 4)
{
avg4.Text = avg3.Text;
}
if (counter >= 5)
{
avg5.Text = avg4.Text;
counter = 0;
}
非常感谢任何帮助。感谢。
答案 0 :(得分:0)
您的问题出在您的一系列if
语句中。简单的调试将允许您看到这一点,因此我建议您在下次来这里之前单步执行代码。这样,您的IF
语句就可以折射成一种简单的方法供您使用。
private void UpdateLabels(string newValue) {
avg5.Text = avg4.Text;
avg4.Text = avg3.Text;
avg3.Text = avg2.Text;
avg2.Text = avg1.Text;
avg1.Text = newValue;
}
这里重要的是您拥有正确的更新订单。原始if
语句的顺序不正确,这就是您遇到问题的原因。如果您想了解其工作原理,请在调试器中查看这两组代码,并查看Label.Text
属性的更改方式。
现在,您可以在从数据库中获取新值后调用此新方法...在这里,我们可以更新您的计时器代码,以便更好。
sql_cmd = sql_conn.CreateCommand();
sql_cmd.CommandText = "SELECT * FROM temp where id=12";
string newValue = String.Empty;
try {
sql_conn.Open();
sql_reader = sql_cmd.ExecuteReader();
while (sql_reader.Read()) {
newValue = sql_reader["Temp1"].ToString(); // store in local variable
}
} catch (Exception e) {
MessageBox.Show(e.Message);
} finally {
sql_conn.Close(); // SqlConnection.Close should be in finally block
}
UpdateLabels(newValue);
首先不再需要计数器(根据您发布的原始代码,从不需要)。由于Label.Text
可以接受空字符串,因此您可以随时复制这些值,无论它是第一次更新还是百万分之一。
其次,您可以将数据库值存储在临时变量中。即使出现数据库错误,也可以更新标签。完成所有数据库操作后,然后使用新值调用UpdateLabels
并完成设置。