假設我在一個自定義控件中定義了一些自定義事件myEvent。現在,在舉辦活動時,此活動將由父級表單捕獲。Winform自定義控件如何通知另一個Winform自定義控件?
如何在另一個自定義控件中捕獲此事件,該控件位於同一父表單上?我希望另一個控件以某種方式訂閱第一個控件事件。
假設我在一個自定義控件中定義了一些自定義事件myEvent。現在,在舉辦活動時,此活動將由父級表單捕獲。Winform自定義控件如何通知另一個Winform自定義控件?
如何在另一個自定義控件中捕獲此事件,該控件位於同一父表單上?我希望另一個控件以某種方式訂閱第一個控件事件。
我在處理MVC時遇到過類似的情況。我喜歡處理它的方式是在控制器中使用中介器設計模式。
基本上,你有一個具有註冊功能和通知功能的類。註冊函數採用實現偵聽器接口和messageId的對象。它將這些存儲在字典中。 notify函數爲需要發送給偵聽器的事件提供一個messageId,並通知相應的事件已經發生。
所以也許東西沿着
public interface IListener
{
void MessageRaised(int messageId, params object[] arguments);
}
public class Mediator
{
public void Register(IListener listener, int messageId)
{
//... add to dictionary of arrays for each messageId
}
public void NotifyListeners(int messageId, params object[] arguments)
{
//... loop through listeners for the messageId and call the MessageRaised function for each one
}
}
行現在通常我有一個基本的控制器,它實現了一個靜態的調解對象。然後我所有的其他控制器繼承它。如果您使用的是代碼並且無法繼承,那麼您可以嘗試使用單例模式。 .Net靜態類也非常棒,因爲它們有一個構造函數,所以你也可以使用它。所以在你的情況下,我會爲每個控件實現IListener後面的代碼,然後在每個控件的構造函數中,有像Mediator.GetInstance()。Register(this,Messages.MyEvent)這樣的東西。這是一種快速和骯髒的方式,可以在未來重構一下,使它更具可重用性。
從快速谷歌搜索一些資源
http://www.avajava.com/tutorials/lessons/mediator-pattern.html
http://sourcemaking.com/design_patterns/mediator
好運
您可以使用事件處理和代表爲和你的接收器控制訂閱間接您發送器控制的事件,VIA兩個控件的父控件,充當多路複用器。
答案很簡單。用正確的簽名以第二種形式(沒有事件的形式)聲明方法並將其標記爲公共。
在父窗體中將第二個窗體的方法分配給第一個窗體的事件。
是剛剛發佈,並引發一個事件,並從你的聽衆控制訂閱。