【问题标题】:ASP.NET: Very simple event handling not workingASP.NET:非常简单的事件处理不起作用
【发布时间】:2009-09-13 18:13:01
【问题描述】:

我有一个对象Order 有一个简单的事件,

Public Event ErrorOccurred(ByVal msg As String)

当找不到订单时,我在构造函数中提出这样的问题(以及设置布尔错误标志:

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

我有一个订阅订单的ErrorOccurred 事件的网络表单:

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

当一个文本框被改变时,它会自动返回页面并采用以下逻辑:

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 行之后执行。

我已经尝试了所有我能想到的方法,但我无法弄清楚可能出了什么问题。我的项目中到处都有事件,它们都使用几乎相同的结构运行良好。我在这里做错了什么?

【问题讨论】:

    标签: asp.net vb.net events


    【解决方案1】:

    我想说,由于您在构造函数中引发事件,甚至在您引用父类中的对象之前,您都无法处理该事件。在这种情况下,尤其是在构造函数中有错误的情况下,抛出异常可能比引发事件要好得多。我最好抛出一个异常,因为调用你的类的一些其他代码甚至可能不处理该事件,而且你很可能想知道发生了错误。抛出异常是让调用代码知道发生了错误的标准方法。事件更多地用于调用类可能想要处理但也可能想要忽略的可选事物。

    【讨论】:

    • 也就是说你不能真正在构造函数中引发事件?
    • 那是正确的,至少您的编码方式是正确的。我可以让它处理来自构造函数的事件的唯一方法是从被调用者传递对调用者的引用,并在引发事件之前显式添加事件处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2016-03-26
    • 2012-11-03
    相关资源
    最近更新 更多