VB.NET中同一事件的多个事件处理程序



我为TextBox1TextBox.Leave事件编写了两个事件处理程序

其原因是,第一个处理程序是用于验证值的多个TextBox.Leave事件的通用处理程序,而第二个处理程序专门用于进行某些值计算的上述TextBox1

我的问题是,当TextBox1.Leave发生时,我能知道两个处理程序中的哪一个将首先执行吗?

(我知道我可以将代码从通用处理程序中删除到TextBox1的特定处理程序中,但我仍然想知道是否有办法。)

感谢

只要使用AddHandler语句添加事件处理程序,就可以保证按添加顺序调用事件处理程序。另一方面,如果在事件处理程序方法上使用Handles修饰符,我认为没有任何方法可以确定顺序

下面是一个简单的例子,演示了由调用AddHandler的顺序确定的顺序:

Public Class FormVb1
Public Class Test
Public Event TestEvent()
Public Sub RaiseTest()
RaiseEvent TestEvent()
End Sub
End Class
Private _myTest As New Test()
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
AddHandler _myTest.TestEvent, AddressOf Handler1
AddHandler _myTest.TestEvent, AddressOf Handler2
_myTest.RaiseTest()
RemoveHandler _myTest.TestEvent, AddressOf Handler1
RemoveHandler _myTest.TestEvent, AddressOf Handler2
End Sub
Private Sub Handler1()
MessageBox.Show("Called first")
End Sub
Private Sub Handler2()
MessageBox.Show("Called second")
End Sub
End Class

我建议您更改为只有一个处理程序,并检测剩下的文本框:

Private Sub txt_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave
Dim txt As TextBox = DirectCast(sender, TextBox)
If txt Is TextBox1 Then
txt.Text = "Very important textbox!"
Else
txt.Text = "Boring textbox ho hum."
End If
End Sub

这只是与具有相同"的多个事件处理程序的执行顺序无关的附加信息;手柄";条款不过,对于那些想知道何时使用";手柄";子句以及何时使用";AddHandler";陈述

当使用UDC(用户定义控件)执行过程/函数或操作表单中的数据时,Addhandler更有用。

UDC对其所附或引用的表格一无所知。

它们是通用的,是为在许多项目中重用而编写的。

以标准";TextBox"控制TextBox知道它所依赖的表单吗?不它的所有属性都可用于表单,但没有一个表单的属性可用于Textbox。(文本框是预先提供的"UDC",微软是定义它的用户)

如果您希望自己的UDC对主表单中的数据进行操作,那么您可以在UDC中定义一个公共事件(让我们将此事件称为"UC_Update")它被放在UDC:中代码顶部的一行上

Public Event UC_Update      ' UC stands for "User Control"

当您的UDC(我们称之为"MyControl")想要处理其父窗体上的数据时,它可以用以下行调用此事件(在UDC代码中):

RaiseEvent UC_Update

在放置或引用此控件的表单的代码中,您将属于您的UDC的此事件附加到您的控件的实例,并";点";将该事件转换为表单中写入的另一个例程。要做到这一点,您可以使用";AddHandler";指令和相关的";地址;操作人员

假设您为操作表单中的数据/控件以及UDC中的数据或方法而编写的过程称为";MyControlUpdater";。它将以你的形式,看起来像这样:

Private Sub MyControlsUpdater()
......(code).......
end sub  

";(代码)";可能是使用UDC中的数据(通过公共属性或公共子/函数)或使用表单中的数据或控件的行。UDC现在可以对表单上的项目执行某些操作。``

您可以在表单的代码中放置以下内容:

AddHandler MyControl.UC_Update, AddressOf MyControlsUpdater

此指令位于UDC实例化后的某个位置:

Dim oMyControl as New MyControl
AddHandler oMyControl.UC_Update, AddressOf MyControlsUpdater

然而,如果UDC在你的表单上以";MyControl1";,通过Visual Studio工具箱放置在那里,然后将处理程序添加到窗体的"中;加载";程序:

Private Sub Form1_Load(sender as object, e as eventargs) Handles Me.Load
AddHandler MyControl1.UC_Update, AddressOf MyControlsUpdater 

需要注意的是,您不能通过此过程传递参数(当使用"AddressOf"时)。这就是为什么没有";发送者";在";MyControlsUpdater";子程序。与UDC相关的价值观必须通过该UDC中的公共财产获得。公共UDC函数和子例程(subs)也可用。

如果您不是使用UDC(通常是这种情况),而是使用其他人(如Microsoft)创建的控件(因此控件的内部代码不可用);手柄";子句来确定当某个事件发生时如何处理控件(例如控件上的"单击")。

Private sub UpdateData(sender as object, e as eventargs) handles Textbox1.Click
........(code)......
End Sub

当然,如果您自己的UDC不需要了解表单上的任何数据,并且您正在引用它,而不是将其物理添加到表单中,那么您可以使用;手柄";按照正常情况,代表您自己的UDC:

Dim MyControl1 as New MyControl 
Private Sub UpdataData(sender as object, e as eventargs) _
handles MyControl1.Text.Leave

在这里,表单使用控件中的数据(通过公共属性),而不是使用表单中数据的控件

相关内容

  • 没有找到相关文章

最新更新