我为TextBox1
的TextBox.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
在这里,表单使用控件中的数据(通过公共属性),而不是使用表单中数据的控件