[英]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.