也许我的问题会让你困惑。
我想触发一个基于我的字符串值改变的事件。
我知道当字符串值发生变化时可能触发事件。
但是问题是:我不知道字符串的值什么时候会改变。
为了解决这个问题,可以使用计时器连续监控字符串值的变化。
但是我需要一个更好的解决方案。
很困惑,是吧?
例如,我有一个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
的值发生变化时引发一个事件。显然我已经假设MyStatus
的Type
是Status
所以把它改成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)