【问题标题】:how to increment counter by one when status changes状态更改时如何将计数器加一
【发布时间】:2016-09-16 19:16:46
【问题描述】:

我需要显示一个计数器。当状态改变时它会加一。如果状态从真变为假,它会加一,但只有一次,然后在下一个假时它会再次增加。我的问题是我正在使用计时器,所以如果我的状态在 1 分钟内保持为假,计数器将显示 60,因为它增加了 1。我只需要增加一次 ..例如,如果它从 true 变为 false ,它将增加一。然后等待状态返回 true 然后再次为 false 然后它应该增加一,否则计数器将只是一。请帮帮我

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;
        }
    }

【问题讨论】:

  • 向我们展示您的代码。
  • 我更新了我的问题

标签: c# timer counter


【解决方案1】:

最简单的方法(无需查看代码)是使用具有副作用的属性(我知道,这不是一个很棒的解决方案),它会为您增加计数器。

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

【讨论】:

  • 谢谢你。我根据这些添加了代码我必须增加计数器
  • 只有在停止或达到服务级别时才会增加。我在计时器中使用该功能。如果它停止或激活,它将不断检查状态。
  • 使用您的代码将同时增加。例如,如果它从 true 变为 false 或 false 变为 true ..
  • @RumarAbbasi 我用评论和调整代码更新了答案。理想情况下,如果您甚至有半复杂的条件逻辑,最好创建一张卡诺图来说明您要完成的工作,并使用它来通知您条件逻辑。
  • 我不是在问 sql bro 。我只是想显示断开计数..如果 opc 将返回已停止或未达到服务,它应该将值增加一。我正在使用计时器,它不断检查 opc 的状态..
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 2017-08-24
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多