【问题标题】:User Control Event against Form Control Event针对表单控制事件的用户控制事件
【发布时间】:2016-05-02 10:18:40
【问题描述】:

这是我的情况,我有一个具有离开事件的用户控件:

Private Sub MyControl_Leave(sender As Object, e As EventArgs) Handles Me.Leave
    If Me.Enabled Then
        MsgBox(Property1)
    End If
End Sub

我有这个来防止 Leave 事件在控件被禁用时触发。

然后在我的表单上,控件也有自己的离开事件,因为我需要设置用户控件上的 离开 事件需要的一些 属性

Private Sub myControlOnForm_Leave(sender As Object, e As EventArgs) Handles MyControlOnForm.Leave
    MyControlOnForm.Property1 = "value1"
End Sub

触发的第一个事件是用户控件上的事件,然后是表单上的事件。

现在我的问题是,正如上面的代码所述,我需要在用户控制事件之前先触发表单事件。

有没有办法解决这个问题?

【问题讨论】:

    标签: vb.net events user-controls


    【解决方案1】:

    表单在完成事件处理后需要调用用户控件中的过程。只需删除 Handles Me.leave 语句和 private 语句。使用表单中的 sub 调用用于处理事件的控件 sub。

    请注意,我已将 sender As 对象更改为 sender As Mycontrol。

    Sub MyControl_Leave(sender As Mycontrol, e As EventArgs) 
        If Me.Enabled Then
            MsgBox(Property1)
        End If
    End Sub
    

    表格上的代码

    Private Sub myControlOnForm_Leave(sender As Mycontrol, e As EventArgs) Handles MyControlOnForm.Leave
        MyControlOnForm.Property1 = "value1"
        sender.MyControl_Leave(sender, e)
    End Sub
    

    【讨论】:

      【解决方案2】:

      触发的第一个事件是用户控件上的事件,然后是表单上的事件。

      现在我的问题是,正如上面的代码所述,我需要表单事件来 在用户控制事件之前首先触发。

      首先,您在该问题陈述中使用了不正确的术语。这不是事件触发顺序问题,而是为 UserControl 的 Leave 事件注册的事件处理程序执行顺序的问题。

      .Net 事件是一种用于调用多播委托的语法糖。当引发事件时,将调用委托,并且处理程序的执行顺序是它们被添加到委托的顺序。您可以通过阅读位于Events (Visual Basic) 下的各种“演练”教程来了解这一点。

      Leave 事件是通过调用 Overridable OnLeave 方法引发,该方法继承自控件的继承树中的控件类。用户控件类。类处理自己生成的事件被认为是不好的形式;首选方法是覆盖引发事件的方法。

      在您的情况下,您希望首先通知订阅该事件的表单,以便它可以在执行某些操作以响应离开 UserControl 之前修改 UserControl 上的属性。

      Public Class UserControl1
          Protected Overrides Sub OnLeave(e As EventArgs)
              MyBase.OnLeave(e)   ' this calls the base method that Raises the event
                                  ' all event handlers will run before the subsequent code
                                  ' executes
              If Me.Enabled Then
                  'do something
              End If
          End Sub
      End Class
      

      【讨论】:

      • 感谢您的回复。这几乎解决了我的问题。但是现在发生的事情是,因为它调用了MyBase.OnLeave(e),所以它被提升了两次?我在If Me.Enabled Then 中添加了MsgBox(""),它出现了两次。
      • @NehrossMontoya,您是否删除了Private Sub MyControl_Leave(sender As Object, e As EventArgs) Handles Me.Leave 代码?该事件只会引发一次,但您可以多次订阅该事件。在MyBase.OnLeave(e)上设置断点,然后单步执行代码观察执行路径。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 2012-08-12
      • 2012-04-23
      相关资源
      最近更新 更多