变量值更改时触发事件

时间:2014-06-13 11:11:20

标签: c# event-handling

也许我的问题会让你感到困惑。

我想根据我的字符串值更改触发事件。

我知道当字符串值改变时可以触发事件。

但问题是:我不知道字符串值何时会改变。

要解决此问题,请使用计时器持续监视字符串值的变化。

但我需要一个更好的解决方案。

感到困惑,是吗?


  

例如,

     
    

我有一个DLL,比如MyDll.dll。

         

MyDll有一个名为STATUS的变量

         

这个变量有两个值,"成功"或" InProgress"。

         

"成功" - 如果一个方法,比如LongProcess,就完成了。 " INPROGRESS" - 如果LongProcess仍在处理中。

  
     

在我的程序中,如果MyDll.STATUS有一个"成功"我需要触发一个事件。值。

为实现这一目标,我可以使用计时器控制来持续监控值何时更改为"成功"。

但我想要一些更好的方法来实现这一目标。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

您可以专门定义属性的get / set行为(使用支持字段),而不是使用字段或auto属性。 通过这种方式,只要该属性的值发生更改,您就可以触发操作/事件。例如......

private Status _myStatus;
public Status MyStatus
{
    get { return _myStatus; }
    set 
      {
        if (value == _myStatus) return;
        _myStatus = value;
       // RAISE YOUR EVENT HERE
      }
}

此示例将允许在MyStatus的值发生更改时引发事件。显然,我已假设Type的{​​{1}}为MyStatus,因此只需将其更改为Status或类型为何。

答案 1 :(得分:0)

在这种情况下,创建一个属性而不是变量。在其设置部分引发一个事件,您可以在其上附加处理程序并收听。

喜欢这个

private string _status;
Public Event OnStatusChanged;

public string Status
{
    get
    {
        return _status;
    }
    set
    {
        _status = value;
        RaiseEvent OnStatusChanged;
    }
}

答案 2 :(得分:0)

您可以使用NO CODING执行此操作。

对于布尔值:1)在表单上创建一个复选框。 2)双击复选框。完成。

VS创建,链接和导航您编辑一个新功能,只要用户点击控件或程序代码实际更改了值,每当复选框发生变化时都会调用该功能。为其分配相同的值无效。 (测试)

...
// Demonstrate behavior:
checkBox1.Checked = false;  // does not trigger checkBox1_CheckedChanged (the first time) because the form defaulted it to false)
checkBox1.Checked = false;  // does not trigger checkBox1_CheckedChanged
checkBox1.Checked = true;   // triggers checkBox1_CheckedChanged
checkBox1.Checked = true;   // does not trigger checkBox1_CheckedChanged
checkBox1.Checked = false;  // triggers checkBox1_CheckedChanged
checkBox1.Checked = false;  // does not trigger checkBox1_CheckedChanged
...

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
  // Modal pop-up to display checkBox1.Checked (it converts to "False" or "True"):
  MessageBox.Show(new Form() {TopMost=true,TopLevel=true}, "Checked =" + checkBox1.Checked, "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

缺点:不是最好的设计模式。你现在在表单上有一个虚假的字段(除非你想要它)。您可以禁用它以防止用户切换它,它仍然可以工作。 (测试)你可以让它隐形,但它仍然“存在”。要将其从表单中删除,您必须替换您借用的GUI代码。

恐怖:在调用checkBox1_CheckedChanged之前,checkBox1.Checked的值或属性会更新,但表格上的复选框在 checkBox1_CheckedChanged返回后才会更新。即使你打电话给this.Update()。 (已测试)(在针对.NET 3.0的VS2010上测试过。)