2014-06-13 316 views
1

也许我的问题会让你困惑。变量值变化时触发事件

我想触发基于我的字符串值更改的事件。

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

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

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

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

弄糊涂了吧?


例如,

我有一个DLL,比方说,MYDLL.DLL。

MYDLL有一个变量名为status

该变量有两个值,无论是 “成功” 或 “INPROGRESS”。

“成功” - 如果一个方法,比如LongProcess完成。 “InProgress” - 如果LongProcess仍在处理中。

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

为了达到这个目的,我可以使用定时器控件持续监视值何时变为“成功”。

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

+1

如果您可以将字符串转换为字符串属性,则可以使用其setter来触发任何其他想要发生的事情。 – TaW

回答

5

而不是使用一个字段,或自动属性,你可以专门定义属性的get/set行为(具有支持字段)。 这样,只要该属性的值发生变化,您就可以触发动作/事件。例如...

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

这个例子将允许引发的事件时的MyStatus变化值。很明显,我已经假设TypeMyStatusStatus,所以只需将其更改为string或任何类型。

+0

虽然这个代码块可能会回答这个问题,但最好能提供一些解释为什么它会这样做。 – PlasmaHH

+0

@PlasmaHH好点。 – Mashton

0

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

像这样

private string _status; 
Public Event OnStatusChanged; 

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

我同意您的观点。但它是由某个人给出的DLL。我只能使用它。 –

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.Checked被checkBox1_CheckedChanged之前更新或属性的值被调用,但形式上的复选框不会更新后,直到 checkBox1_CheckedChanged回报。即使你拨打this.Update()。 (已测试)(在VS2010上针对.NET 3.0进行测试。)

+0

要做到这一点是不是布尔值的属性?还是一个不涉及用户界面? – Mashton

相关问题