2009-09-13 140 views
0

我有一個簡單的事件的對象OrderASP.NET:很簡單的事件處理無法正常工作

Public Event ErrorOccurred(ByVal msg As String) 

,我在像這樣的構造提高當訂單無法找到(沿W /設置布爾錯誤標誌:

RaiseEvent ErrorOccurred("This order does not exist in the database.") 
[Error] = True 

我訂閱了訂單的ErrorOccurred事件一個WebForm:

Public WithEvents o As New Order 

和我有表單上的錯誤處理程序方法:

Private Sub OnErrorOccurred(ByVal msg As String) Handles o.ErrorOccurred 
    litMsg.Text = "<p class=""error-confirm"">" & msg & "</p>" 
End Sub 

當文本框被改變時,它autoposts回頁面,並採用以下邏輯:

Private Sub txtOrderID_TextChanged(ByVal sender As Object,_ 
ByVal e As System.EventArgs) Handles txtOrderID.TextChanged 
    If IsNumeric(txtOrderID.Text) Then 
    If o.OrderID = 0 Then o = New Order(txtOrderID.Text) 
     If Not o.Error Then 
     'do stuff' 
     Else 
     'error, run error handling' 
     End If 
     .... 

當存在錯誤(當Else邏輯運行時),除非事件未觸發,否則所有內容都按預期執行。但是,由於Error標誌設置爲true,這意味着事件必須已經觸發,因爲該行在RaiseEvent行之後執行。

我試過了所有我能想到的東西,但我無法弄清楚什麼可能是錯的。我的項目中到處都有活動,他們都使用幾乎相同的結構很好地工作。我在這裏做錯了什麼?

回答

2

我會說,既然你是在構造函數中引發事件,甚至在你的父類中沒有引用對象之前,你無法處理該事件。在這種情況下,特別是在構造函數中出現錯誤的情況下,拋出異常可能比引發事件好得多。我最好拋出一個異常,因爲調用你的類的其他代碼甚至可能不處理這個事件,而你很可能想知道發生了錯誤。拋出異常是讓調用代碼知道發生錯誤的標準方式。事件對於調用類可能想要處理的可選事件來說更多,但它也可能要忽略。

+0

那麼這是說,你不能真的在構造函數中引發事件? – Jason 2009-09-13 18:21:07

+0

謝謝....這真的有幫助 – Jason 2009-09-13 18:27:34

+0

這是正確的,至少是你編碼它的方式。我可以通過構造函數來處理事件的唯一方法是在拋出事件之前,從被調用者傳入對調用者的引用,並添加事件處理程序explicity。 – Kibbee 2009-09-13 18:31:25