2011-07-10 31 views
0

我想使用VB .NET 4.0事件處理來放鬆項目中的對象依賴關係。 我編譯如下(簡單的)例子說明我的問題的性質代碼:VB .NET中的事件處理

實例形式(應當抓住引發的事件):例如1類(只是一類

Public Class Form1 

Dim WithEvents obj1 As Class1 
Dim WithEvents obj2 As Class2 

Private Sub Form1_Load(ByVal sender As System.Object, _ 
    ByVal e As System.EventArgs) Handles MyBase.Load 
    obj1 = New Class1 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, _ 
    ByVal e As System.EventArgs) Handles Button1.Click 
    obj1.sendEvent() 
End Sub 

Public Sub handleEventFromClass2(ByRef sender As Class2, _ 
    ByVal op As Integer) Handles obj2.TestEvent 
    TextBox1.Text = "Wert : " & op 
End Sub 
End Class 

內容在中間):實施例的

Public Class Class1 

Public Sub sendEvent() 
    Dim c2 As New Class2 
    c2.sendEvent() 
End Sub 

End Class 

內容等級2(定義和引發事件):

Public Shared Event TestEvent(ByRef sender As Class2, _ 
    ByVal testInteger As Integer) 

Public Sub sendEvent() 
    RaiseEvent TestEvent(Me, 4) 
End Sub 

End Class 

我曾期待Form1處理事件 - 事實並非如此。有什麼辦法可以將事件「跨越」不相互「意識到」的對象發送出去嗎?

在此先感謝

克里斯

回答

2

編譯器不會爲此生成錯誤,這有點令人傷心。你必須使它看起來像這樣:

Private Sub Form1_Load(ByVal sender As System.Object, _ 
     ByVal e As System.EventArgs) Handles MyBase.Load 
    obj1 = New Class1 
    AddHandler Class2.TestEvent, AddressOf handleEventFromClass2 
End Sub 

Private Sub handleEventFromClass2(ByRef sender As Class2, _ 
    ByVal op As Integer) 
    TextBox1.Text = "Wert : " & op 
End Sub 

注意失蹤把手上的事件處理程序關鍵字和明確的使用AddHandler關鍵字。然而,你會因這些共享事件而陷入困境。沒有任何機制會自動取消訂閱該活動,共享使其成爲全球性的,因此它在您的程序期間生活。即使在用戶關閉表單之後。這將會變得很糟糕,因爲表單對象已經死了,所以當您觸發事件時可能會引發ObjectDisposedException。此外,由於表單對象不能被垃圾收集,因此你有永久泄漏。

你必須明確地退訂事件:超出它們的聽衆是麻煩

Private Sub Form1_FormClosed(ByVal sender As Object, _ 
     ByVal e As FormClosedEventArgs) Handles Me.FormClosed 
    RemoveHandler Class2.TestEvent, AddressOf handleEventFromClass2 
End Sub 

事件源。檢查this answer是一種完全不同的方法。

+0

嗨漢斯!非常感謝這個完美的解釋!我最初的意圖是使用Events來實現代碼部分之間的鬆散耦合。共享事件的使用更多的是絕望的行爲:-)。很高興知道這至少是一種可能的選擇。經過一番考慮之後,我回過頭來加入一個界面而不是使用事件的經典方法。再次感謝您的回答! – Chris

0

的問題是你有Class2兩個不同的實例。您可以使Class1的構造函數將Class2的實例作爲參數。

+0

Thx Tim,有什麼辦法避免Form和Class2之間的這種耦合?更多的是在「系統」事件的意義上。 – Chris