2009-09-04 160 views
4

我想用c#手動觸發一個事件。例如,說如果我想從Form B中觸發Form A的Form_closing事件。怎麼做?在c中手動觸發事件#

得到一些意見後。我想我需要更多地解釋這一點。

由於我的A型是參照其會在桌面自定義任務欄上一個.dll, 還有一種情況,我從表B.關閉該自定義任務欄 我已經嘗試過FormA.Close()從表單B.當我這樣做時,.dll從應用程序域中卸載,並由此導致自定義任務欄佔用的空間被阻止。

但是,當我點擊自定義任務欄中的關閉按鈕時,情況並非如此。當我這樣做時,空間就被釋放了。

這就是我想從Form B手動發起Form A的close事件的原因,這將解決我的問題。

謝謝。

回答

13

我們做了以下一個項目:

有一個GlobalNotifier類,它定義的事件,我們希望在應用程序的不同模塊來使用,這樣

public static class GlobalNotifier 
{ 

    public static event VoidEventHandler EnvrionmentChanged; 

    public static void OnEnvrionmentChanged() 
    { 
     if (EnvrionmentChanged != null) 
     { 
      EnvrionmentChanged(); 
     } 
    } 
} 

然後,你可以提高這個事件在任何地方,當你需要讓其他應用程序知道環境已經改變,像這樣

GlobalNotifier.OnEnvrionmentChanged(); 

而且你也可以su只要你想得到有關環境已經改變的事實的通知,就可以訂閱這個活動。

public ReportingService() 
    { 
     GlobalNotifier.EnvrionmentChanged += new VoidEventHandler(GlobalNotifier_EnvrionmentChanged); 
    } 

    void GlobalNotifier_EnvrionmentChanged() 
    { 
     //reset settings 
     _reportSettings = null; 
    } 

所以,當你改變了環境,你提到的事件,大家誰需要了解這一點,執行一些動作,被通報。 可能與您需要實現的類似。

另外,如果你需要傳遞參數,你可以定義事件,你喜歡的任何方式,基本上是 - 我的意思是我想從表B.說提高,形式A的事件像

public static event VoidEventHandler<SomeObject, List<OtherObject>> SomethingUpdated; 

    public static void OnSomethingUpdated(SomeObject sender, List<OtherObject> associations) 
    { 
     if (SomethingUpdated != null) 
     { 
      SomethingUpdated(sender, associations); 
     } 
    } 

    // ... 

    MyClass.SomethingUpdated+= new VoidEventHandler<SomeObject, List<OtherObject>>(MyClass_SomethingUpdated); 

    // ... 

    void MyClass_SomethingUpdated(SomeObject param1, List<OtherObject> param2) 
    { 
     //do something 
    } 
1

您可以調用Form類的OnFormClosing()方法。您可以使用配對的On...()方法進行此操作。

+0

,提供下面的Form B Form_A.FormClosing + = new System.Windows.Forms.FormClosingEventHandler(------);如果這是正確的,請告訴我如何傳遞對象和事件參數以形成A – Anuya 2009-09-04 02:10:29

+0

您可以在公開方法中公開On ...(),但正如Joel所說,如果您想手動提升事件而不實際調用Form.Close(),你可能做錯了什麼。 – mgbowen 2009-09-04 02:12:57

+0

@ darkassassin93,給出了我的場景更多的解釋。 – Anuya 2009-09-04 02:21:11

1

關閉窗體。這將提高事件。如果您想要將事件與關閉表單分開提出,那麼您做錯了事;將該代碼移到可以從事件和FormB調用的單獨方法。

FormAInstance.Close() 

從Visual Studio 2005(.Net 2.0)開始,窗體具有自動默認實例。聽起來這就是你正在使用的。您應該知道該功能主要是爲了與VB6向後兼容。您最好創建並使用表單的新實例。當你這樣做時,你應該能夠在該應用程序域關閉的情況下調用該實例的.Close()方法。

如果你想重新使用這個空間,你也可以嘗試簡單的.Hide()-表單而不是關閉它。

+0

我的意思是我想要從表單B中提出事件。表格A 如果這是正確的,請告訴我如何將對象和事件參數傳遞給A – Anuya 2009-09-04 02:09:54

+0

@JoelCoehoorn,給出我的場景的更多解釋。 – Anuya 2009-09-04 02:21:47

+0

也許你的術語是錯的。這聽起來有點像你希望_subscribe_或_listen_參加活動。提高它意味着不同的東西。 – 2009-09-04 02:41:25

1

這聽起來對我來說,從你的意見,如你不想提高一個形式的事件從另一個;你只需要處理從另一個窗體的事件。

是的,你可以做到這一點。 FormB需要參考FormA。有幾種方法可以做到這一點;一個簡單的方法是有一個FormA類型屬性在FormB類,像這樣:

public FormA TheOtherForm { get; set; } 

您設置該屬性,您的FormA實例,然後添加事件處理程序,您在註釋中描述。

您不必使用FormA作爲您的財產的類型;任何形式都有FormClosing事件,因此如果需要,可以使用Form作爲類型。

+0

Form_A.FormClosing + = new System.Windows.Forms.FormClosingEventHandler(------);如果這是正確的,請告訴我如何傳遞對象和事件參數 – Anuya 2009-09-04 02:34:07