2015-04-02 57 views
0

好的,在過去3年使用WPF之後,我剛剛開始使用Winforms。我需要從一種形式(當客戶信息更新時)觸發事件,並讓另一種形式訂閱該事件並執行一些處理以更新顯示的客戶信息,如果更新的客戶與其他客戶相匹配形成。我只能找到在子窗體或父窗體或從用戶控件到父窗體的窗體上執行此操作的示例,其中父窗體具有對訂閱該事件的子窗體的引用。我找不到任何有關如何將這些信息設置爲兩個不相關且不相互引用的表單的信息。我只想從一種形式發起一個事件,然後從另一個形式中挑選出來。似乎它應該很容易,但我沒有太多的運氣。任何幫助表示讚賞!謝謝!WinForms中兩個無關表單之間的事件

UPDATE:這是我迄今爲止設置:包含事件和方法,提高事件

對象。需要訂閱事件

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click   
    Dim customerEvents As New CustomerEvents 
    customerEvents.RaiseCustomerInformationUpdated(iCustomerID) 
    Me.Close() 
End Sub 

形式:即引發事件的

Public Class CustomerEvents 

    Public Event CustomerInformationUpdatedEvent(ByVal customerId As Integer) 

    Public Sub RaiseCustomerInformationUpdated(ByVal customerId As Integer) 
     RaiseEvent CustomerInformationUpdatedEvent(customerId) 
    End Sub 

End Class 

形式

Private Sub myForm_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated 
    Dim customerEvents As New CustomerEvents 
    AddHandler customerEvents.CustomerInformationUpdatedEvent, AddressOf HandleCustomerInformationUpdated 
End Sub 

Private Sub HandleCustomerInformationUpdated(ByVal customerid As Integer) 
     ' Processing 
End Sub 

但HandleCustomerInformationUpdated永遠不會被擊中。我究竟做錯了什麼??謝謝!

+0

使用'As New'無法工作,您會得到一個新的實例,但目前還沒有人可以訂閱該事件。 – 2015-04-02 17:19:42

回答

1

最好的選擇是使用你可以傳遞給兩個表單的pub/sub類型的服務。基本上創建一個具有事件的對象,以及觸發該事件的方法。然後,需要通知他人的表單可以接受該對象並在適當時調用觸發器方法,並且其他表單可以全部附加到該對象。

編輯

下不完整的服務宣言應該給予一些想法。

public class EventService { 
    public EventHandler MyEvent {add;remove;} 
    public void TriggerMyEvent() { 
     MyEvent(); 
    } 
} 

它可能然後通過創建單個副本並傳遞EventService實例到構造的形式使用。隨後出版的形式也只是做myEventServiceInstance.TriggerMyEvent(),而訂閱的形式,對建立將註冊myEventServiceInstance.MyEvent;

理想情況下,你會使用一個IoC容器中通過一個實例,並處理對象的生命週期,但畢竟是在範圍之外這個問題。

+0

謝謝,這就是我在想什麼,我只是不知道如何實現它。我不應該用觸發它的事件和方法來創建對象,但是我對如何實際觸發它然後在其他表單上捕獲它感到困惑。你能拋出一些僞代碼或例子嗎?謝謝! – DonnieDarko 2015-04-02 16:48:51

+0

再次感謝。這一行讓我暫停:「然後可以通過創建一個副本並將EventService實例傳遞給窗體的構造函數來使用它。」因爲這些形式是完全不相關的,並且不能從同​​一地點附近的任何地方打開。我想我可以有一個實例的模塊,我傳遞給窗體構造函數? – DonnieDarko 2015-04-02 17:08:44

+0

是的,那就是你使用類似Unity的東西來處理依賴注入的地方。無論您是否需要單獨的模塊,取決於您是否希望能夠跨模塊進行發佈,以及您現在確切地設置了您的依賴關係。如果所有訂閱組件都位於依賴發佈者模塊的模塊中,那麼您可能只需將該服務包含在發佈者模塊中。 – Travis 2015-04-02 17:14:47