如何在状态更改时将计数器加一

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() 函数来获取日期和时间,而不是从应用程序发送。