当变量值发生变化时触发事件

本文关键字:事件 变量值 变化 | 更新日期: 2023-09-27 18:08:41

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

我想触发一个基于我的字符串值改变的事件。

我知道当字符串值发生变化时可能触发事件。

但是问题是:我不知道字符串的值什么时候会改变。

为了解决这个问题,可以使用计时器连续监控字符串值的变化。

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

很困惑,是吧?


例如,

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

MyDll有一个名为STATUS的变量

该变量有两个值,Success或InProgress

"Success" -如果一个方法,比如说,LongProcess,完成了。"InProgress" -如果LongProcess仍在处理

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

为了实现这一点,我可以使用一个计时器控件来连续监视当值变为"Success"时。

但是我想要一些更好的方法来实现这一点。任何建议吗?

当变量值发生变化时触发事件

不使用字段或auto属性,您可以专门定义属性的get/set行为(使用支持字段)。通过这种方式,您可以在该属性的值发生变化时触发操作/事件。例如:

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

这个例子将允许在MyStatus的值发生变化时引发一个事件。显然我已经假设MyStatusTypeStatus所以把它改成string或者其他类型

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

这样的

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

您可以使用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代码。

Horror: checkBox1的值或属性。Checked在checkBox1_CheckedChanged被调用之前得到更新,但是表单上的复选框直到 checkBox1_CheckedChanged返回后的才更新。即使你调用this.Update()。(已测试)(在VS2010上测试,目标是。net 3.0)