如果您不注销事件处理程序,这只是一个坏习惯。在您的子控件上,提供注册/取消注册事件处理程序的功能。很多奇怪的行为(几乎总是很难调试)会发生:就像在同一个控件上多次注册一个事件处理程序一样。更不用说内存泄漏了。
下面是我在生产代码中看到的一个示例。过度简化了演示过程。
Public Class Form1
Private Sub btnAddHandler_Click(sender As Object, e As EventArgs) Handles btnAddHandler.Click
AddHandler btnClickMe.Click, Sub()
txtLog.Text &= "Clicked!" & vbCrLf
End Sub
txtLog.Text &= "Added event handler." & vbCrLf
End Sub
End Class
对于每次单击btnAddHandler
,btnClickMe
将追加"Clicked!" & vbCrLf
很多次txtLog被点击时它。这是一个非常简单的例子,但是如果你不小心,并且事件做了更重要的事情,它可以为调试带来乐趣。 ;)
不,我不会说这是不好的做法,做你在做什么。发件人是可区分的,只要你不做像上面例子那样的野蛮事情,你应该没问题。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is TextBox Then
With DirectCast(ctrl, TextBox)
AddHandler .GotFocus, AddressOf TextBox_GotFocus
AddHandler .LostFocus, AddressOf TextBox_LostFocus
End With
End If
Next
End Sub
Private Sub TextBox_GotFocus(sender As Object, e As EventArgs)
DirectCast(sender, TextBox).BackColor = Color.Azure
End Sub
Private Sub TextBox_LostFocus(sender As Object, e As EventArgs)
DirectCast(sender, TextBox).BackColor = Color.DimGray
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is TextBox Then
With DirectCast(ctrl, TextBox)
RemoveHandler .GotFocus, AddressOf TextBox_GotFocus
RemoveHandler .LostFocus, AddressOf TextBox_LostFocus
End With
End If
Next
End Sub
End Class
此代码非常好。
'.Click' ='[“LOCO FOCUS FUNCTION”]?按道理??? – OneFineDay 2014-10-18 23:07:19
[“失去对焦功能”]只是实际功能的替代品。我认为这样说更具解释性。包含函数的名字并不重要,但MyMouseDown()实际上被称为 – Solo116 2014-10-19 00:23:50
我知道,我只是没有想到用失败事件丢失焦点。 – OneFineDay 2014-10-19 01:06:12