如何在状态更改时将计数器加一
how to increment counter by one when status changes
我需要显示一个计数器。当状态 changes.if 状态从 true 变为 false 时它会增加 1,它会增加 1,但只有一次然后在下一个 false 时它会再次增加。我的问题是我正在使用计时器,所以如果我的状态在 1 分钟内保持错误,计数器将显示 60,因为它增加了 1。我只需要增加一次……例如,如果它从真变为假,它将增加一个。然后等待,如果状态回到真,然后再次为假,那么它应该增加一个,否则计数器将只是一个。请帮助我
void opc_status()
{
Int32 InRuntimeNumber = 0;
InRuntimeNumber = ModuleNetworkNode.OPCSystemsComponent1.InRuntime("192.168.1.2");
if (InRuntimeNumber == -1)
{
textBox.Text= "Service not reached";
}
else if (InRuntimeNumber == 1)
{
textBox.Text = "Active";
}
else
{
textBox.Text = "Stopped";
//rectangle_opc.Fill = new SolidColorBrush(Color.FromRgb(255, 226, 77));
}
public Boolean Status
{
get
{
return _status;
}
set
{
if (_status != value)
{
if (con.State != ConnectionState.Open)
{
con.Close();
con.Open();
}
SqlCommand cmd = new SqlCommand(" INSERT INTO Report (Date,Time, Event, [Type of Alarm]) VALUES ('" + DateTime.Now.Date.ToShortDateString() + "','" + DateTime.Now.ToString("t") + "','" + textBox.Text + "','" + "opc" + "')", con);
cmd.ExecuteNonQuery();
counterlabel.Content = counter++;
}
_status = value;
}
}
最简单的方法(不看代码)是使用 属性,它有副作用(我知道,这不是一个很棒的解决方案),它会为您增加计数器。
public class foo{
private bool bar;
private int counter;
private bool Bar {
get{
return bar;
}
set{
if(bar != value && bar){
counter++;
}
bar = value;
}
}
}
编辑:根据要求更新。应该注意的是,这不是一个很好的方法,而是修改 bar
属性 的方法会更好。
此外,问题中提供的代码也存在一些问题:
- SQL 注入漏洞
- 修改 属性 导致将记录写入数据库的副作用。
- 最好使用 SQL
GETDATE()
或 GETUTCDATE()
函数来获取日期和时间,而不是从应用程序发送。
我需要显示一个计数器。当状态 changes.if 状态从 true 变为 false 时它会增加 1,它会增加 1,但只有一次然后在下一个 false 时它会再次增加。我的问题是我正在使用计时器,所以如果我的状态在 1 分钟内保持错误,计数器将显示 60,因为它增加了 1。我只需要增加一次……例如,如果它从真变为假,它将增加一个。然后等待,如果状态回到真,然后再次为假,那么它应该增加一个,否则计数器将只是一个。请帮助我
void opc_status()
{
Int32 InRuntimeNumber = 0;
InRuntimeNumber = ModuleNetworkNode.OPCSystemsComponent1.InRuntime("192.168.1.2");
if (InRuntimeNumber == -1)
{
textBox.Text= "Service not reached";
}
else if (InRuntimeNumber == 1)
{
textBox.Text = "Active";
}
else
{
textBox.Text = "Stopped";
//rectangle_opc.Fill = new SolidColorBrush(Color.FromRgb(255, 226, 77));
}
public Boolean Status
{
get
{
return _status;
}
set
{
if (_status != value)
{
if (con.State != ConnectionState.Open)
{
con.Close();
con.Open();
}
SqlCommand cmd = new SqlCommand(" INSERT INTO Report (Date,Time, Event, [Type of Alarm]) VALUES ('" + DateTime.Now.Date.ToShortDateString() + "','" + DateTime.Now.ToString("t") + "','" + textBox.Text + "','" + "opc" + "')", con);
cmd.ExecuteNonQuery();
counterlabel.Content = counter++;
}
_status = value;
}
}
最简单的方法(不看代码)是使用 属性,它有副作用(我知道,这不是一个很棒的解决方案),它会为您增加计数器。
public class foo{
private bool bar;
private int counter;
private bool Bar {
get{
return bar;
}
set{
if(bar != value && bar){
counter++;
}
bar = value;
}
}
}
编辑:根据要求更新。应该注意的是,这不是一个很好的方法,而是修改 bar
属性 的方法会更好。
此外,问题中提供的代码也存在一些问题:
- SQL 注入漏洞
- 修改 属性 导致将记录写入数据库的副作用。
- 最好使用 SQL
GETDATE()
或GETUTCDATE()
函数来获取日期和时间,而不是从应用程序发送。