2014-06-13 307 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

相關問題