簡體   English   中英

在 C# 中手動觸發事件

[英]manually firing the event in c#

我想使用 c# 手動觸發一個事件。 例如,假設我想從 Form B 觸發 Form A 的 Form_closing 事件。該怎么做?

在得到一些評論后。 我想我需要對此進行更多解釋。

由於我的表單 A 是對在桌面上創建自定義任務欄的 a.dll 的引用,因此我有一種情況可以從表單 B 中關閉該自定義任務欄。我已經從表單 B 中嘗試過 FormA.Close()。當我這樣做時這個,.dll 從應用程序域中卸載,因此自定義任務欄占用的空間被阻止。

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

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

謝謝。

我們在一個項目中做了以下工作:

有一個 GlobalNotifier 類,它定義了我們想要在應用程序的不同模塊中使用的事件,就像這樣

public static class GlobalNotifier
{

    public static event VoidEventHandler EnvironmentChanged;

    public static void OnEnvironmentChanged()
    {
        if (EnvironmentChanged != null)
        {
            EnvironmentChanged();
        }
    }
 }

然后,當您需要讓應用程序的其余部分知道環境已更改時,您可以在任何地方引發此事件,如下所示

    GlobalNotifier.OnEnvironmentChanged();

你也可以在任何你想收到環境變化通知的地方訂閱這個事件。

    public ReportingService()
    {
        GlobalNotifier.EnvironmentChanged += new VoidEventHandler(GlobalNotifier_EnvironmentChanged);
    }

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

因此,每當您更改環境時,您都會引發事件,並且所有需要了解該情況並執行某些操作的人都會收到通知。 可能類似於您需要實現的目標。

另外,如果你需要傳遞參數,你可以按照你喜歡的方式定義事件,基本上 -

    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
    }

您將調用 Form 類的OnFormClosing()方法。 您可以對任何具有配對On...()方法的事件執行此操作。

關閉窗體。 這將引發事件。 如果您想在關閉表單的同時引發事件,那您就做錯了; 將該代碼移動到您可以從事件和 FormB 調用的單獨方法。

FormAInstance.Close()

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

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

從您的評論來看,在我看來,您不想從另一種形式引發一種形式的事件; 您只想處理一個表單的事件。

是的,你可以這樣做。 FormB需要引用FormA 有幾種方法可以做到這一點; 一種簡單的方法是在 FormB 類中使用FormA類型屬性,如下所示:

public FormA TheOtherForm { get; set; }

您將該屬性設置為您的FormA實例,然后按照您在評論中描述的那樣添加事件處理程序。

您不必使用FormA作為您的財產類型; 任何表單都有FormClosing事件,因此您可以根據需要使用 Form 作為類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM