2009-09-13 138 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